Код работает в глобальной области, но не в локальной области? - PullRequest
0 голосов
/ 13 апреля 2009

Эта функция должна возвращать 36, но возвращает 0. Если я бегу по логике построчно в интерактивном режиме, получаю 36.

код

from math import *

line = ((2, 5), (4, -1))
point = (6, 11)

def cross(line, point):
    #reference: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry1
    ab = ac = [None, None]
    ab[0] = line[1][0] - line[0][0]
    ab[1] = line[1][1] - line[0][1]
    print ab
    ac[0] = point[0] - line[0][0]
    ac[1] = point[1] - line[0][1]
    print ac
    step1 = ab[0] * ac[1] 
    print step1
    step2 = ab[1] * ac[0]
    print step2
    step3 = step1 - step2
    print step3
    return float(value)

cross(line, point)

выход

[2, -6] # ab
[4, 6]  #ac
24      #step 1 (Should be 12)
24      #step 2 (Should be -24)
0       #step 3 (Should be 36)

В соответствии с интерактивным режимом это должно быть результатом шагов 1, 2 и 3

>>> ab = [2, -6]
>>> ac = [4, 6]
>>> step1 = ab[0] * ac[1]
>>> step1
12
>>> step2 = ab[1] * ac[0]
>>> step2
-24
>>> step3 = step1 - step2
>>> step3
36

(Было бы здорово, если бы кто-то дал этому хорошее название)

Ответы [ 2 ]

5 голосов
/ 13 апреля 2009

У вас есть ab и ac, указывающие на одну и ту же ссылку. Изменить это:

ab = ac = [None, None]

к этому:

ab = [None, None]
ac = [None, None]
1 голос
/ 13 апреля 2009

В строке ab = ac = [None, None] вы присваиваете тот же список переменным ab и ac. Когда вы меняете одно, вы меняете другое одновременно.

Причина, по которой он работает в интерактивном режиме, заключается в том, что вы не инициируете списки одинаковым образом.

Поменяйте местами первую строку в вашей функции следующим образом:

ab = [None, None]
ac = [None, None]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...