2014-02-13 32 views
0

我對Python非常新,所以我很抱歉,如果這是一個相當小巧的問題。但是我正在寫一個由.txt文件中的數據組成的2D列表,其中包含for循環(所有代碼都可以),但循環似乎會覆蓋我以前寫入的所有數據,但每次都要通過,儘管我是通過循環的Python列表寫入,所有以前的值被覆蓋

這不是我真正的代碼,而是總結了我遇到的問題。

stuff = [[None]*3]*10 

for index in range(10): 
    stuff[index][2]=index 

print(stuff) 

[[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9]] 

爲什麼所有的值返回爲9,爲什麼我有什麼做的就是它返回的

[[None, None, 1],[None, None, 2],[None, None, 3],[None, None, 4],[None, None, 5],[None, None, 6],[None, None, 7],[None, None, 8],[None, None, 9]] 
+0

'stuff [0]是stuff [1]'... TIL'[x] * y'特別設計 – richizy

回答

1

之所以發生這種情況是因爲你的第一行:

stuff = [[None]*3]*10 

這是什麼東西做的其實是創造只1陣列的[[None]*3],然後引用它10倍。

所以你的數組實際上類似於:

[[[None]*3], reference 0, reference 0, reference 0, reference 0, reference 0, reference 0, reference 0, reference 0, reference 0] 

更改您的第一行:

stuff = [[None]*3 for i in xrange(10)] 

這將在陣列中的每個位置創建一個獨特的元素。

+0

感謝您的解釋,我沒有意識到這是列表在Python中的工作方式。 – Remnet

1

你把完全相同的數組列表中的十倍。更新其中一個陣列正在更新所有這些數組。嘗試:

stuff = [[None]*3 for i in xrange(10)]