2016-05-21 79 views
-1

我有一個python列表列表。在python列表中對列表進行索引

z=[[0]*6]*7 

由於所有元素都爲0。但現在,如果我想要的清單e.g

z[0][0]=2 

這應該更改第一個列表的第一個元素中改變一個單獨的元素。但它實際上改變了所有元素的第一個元素。這對我來說太不合邏輯了。 有人可以幫忙。

[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0]] 

回答

1

這是一個古典的「程序員的陷阱」的蟒蛇。

l = [ 0 ] * 6 

創建包含參考六次到相同蟒對象,在此,數值常數0列表。

現在,設定

l[0] = 1 

取代第一參考const 0對象由參考至另一對象,該對象const 1

現在,讓我們來看看

z=[[0]*6]*7 

這首先創建包含六個引用到const 0對象列表,然後它創建包含七個引用到六元素列表清單。

現在,

z[0] 

會給你從z的第一要素,這簡直就是相同所有其他六個要素。

證明:

print id(z[0]) == id(z[1]) 

不同的對象有不同的ID。

所以你從來沒有真正列出不同的列表,而是列出了所有的列表。

實際上,你可以創建不同的子列表,並把它們放到一個做類似

z = [ [0]*6 for _ in range(7) ] 

然而,給我的感覺你實際上可能需要使用矩陣 - 如果這是真的的話,numpyndarray是因爲:

import numpy 
z = numpy.ndarray((7,6)) 

實際上爲您提供了一個包含42個數字元素的矩陣。