2013-05-25 77 views
1

我已經在編程鍛鍊寫入以下代碼的出:Python變量值重置循環

q = lenP[0]*[lenP[1]*[0.]] # empty 2D array 
for i in range(lenP[0]): 
    for j in range(lenP[1]): 
     hit = (Z == colors[i][j]) 
     q[i][j] = (hit * sensor_right + (1-hit) * (1.-sensor_right)) * p[i][j] 

每個元素Q的值[i] [j]被正確,如果我測試對於它的內部所設置的循環。但是,如果我在循環外部打印任何q [i] [j],它已經恢復到它的初始值0.我想我已經錯過了對對象的Python引用的管理,但那會是什麼?

在一個正常的設置中,我會使用numpy作爲數組並且完成它,但這是一個Udacity課程的代碼(IA for Robotics,非常有趣),一個不允許導入任何東西。

+0

你不知道,這個問題實際上是在這裏的第一行代碼,但具有完全相同的問題問題的原因已經出現了很多次。 –

+0

謝謝您指出另一個問題。這不是我第一次面對這個問題,但它總是以一種新形式掩飾:)。 – vkubicki

回答

5

在你所有的行之間共享這裏。 我儘量減少你的例子:

q = 2 * [ 2 * [0] ] 
for i in range(2): 
    for j in range(2): 
     q[i][j] = (1-i) * j 
     print(q) 

你會看到,我們每次重新定義同一行:

[[0, 0], [0, 0]] 
[[0, 1], [0, 1]] 
[[0, 1], [0, 1]] 
[[0, 0], [0, 0]] 

好的版本將使用

定義不共享一個真正的矩陣
q = [ [ 0 for j in range(2) ] for i in range(2) ] 

或任何其他成語與保證行之間的獨立性。

當然,結構簡單這樣,你可以刪除的for循環:

q = [ [ (1-i) * j for j in range(2) ] for i in range(2) ] 
+0

在構建矩陣時計算矩陣會更好。而不是創建和覆蓋它。 – Achim

+0

@Achim:是的,你是對的我已經完成了我的回答。謝謝。 – deufeufeu

+0

當我得到它時,每一行都是對同一列表對象的引用,並且因爲它是一個列表,所以它是可變的,所以每次都改變相同的內容。但是,在一行內,指向的對象是不可變的,因此可能會不同。對 ? – vkubicki