2009-04-12 12 views
0

この関数は、36を返すべきであるが、私は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) 

よると、私が得る対話モードでのラインによって、論理回線を介して実行した場合には、0を返します。対話モードにするには、これはstep1、step2、およびstep3の結果である必要があります。

>>> 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 

(誰かがこれに良いタイトルを付けることができればうれしいです)

+0

値の値は何ですか:) – WhatIsHeDoing

+0

これは 'NameError:global name 'value'は定義されていません。 – epochwolf

答えて

5

あなたはabとacが同じ参照を指しています。これに

ab = ac = [None, None] 

:これを変更して行ab = ac = [None, None]

ab = [None, None] 
ac = [None, None] 
+0

うわー...私はこれを1時間のうちに見つけようとしています!愚かな私。私は最近、あまりC++を責める。 – epochwolf

1

、あなたは同じリストは、変数ABとACに割り当てます。 1つを変更すると、同時に他のものを変更します。

対話的に動作するのは、同じ方法でリストを初期化しないからです。

スワップこれであなたの関数の最初の行:

ab = [None, None] 
ac = [None, None] 
関連する問題