2014-10-28 53 views
0

假設我有這樣的代碼:乘陣列,使矩陣給人意想不到的結果

dim = 3 
eye = [[0] * dim] * dim 

,它是名單的名單,我查

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

現在,如果我這樣做,我得到:

eye[1][2] = 1 
eye 
[[0, 0, 1], [0, 0, 1], [0, 0, 1]] 

但是,如果我手動把這個表達式,上面的代碼按預期工作:

eye2=[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
eye2[1][2] = 1 
eye2 
[[0, 0, 0], [0, 0, 1], [0, 0, 0]] 

這兩者有什麼區別?

更新:感謝所有的說明,假設我有這樣的代碼:

a = [0] 
type(a) 
b = a * 3 # or b = [[0] *3] 

因此,B持有3次對。我期望改變b [0]或b [1]或b [2]會改變所有3個元素。
但是這段代碼顯示了正常的行爲,爲什麼呢?

b[1] = 3 
b 
[0, 3, 0] 
+0

有人教我,我可以做這種標量乘法列表。如果結果很奇怪,這種方法的應用是什麼? – user1502776 2014-10-28 06:17:39

回答

1

任何數組條目是作爲內存地址的標籤,當你多將其與一個變量實際上你創建了一個指向你的數組中的3宮殿!

Matrix = [[0 for x in xrange(3)] for x in xrange(3)] 
0
dim = 3 
eye = [[0] * dim] * dim 

其做出的相同的副本,如果你在一個地方進行更改會反映到所有

0
dim = 3 
eye = [[0] * dim] * dim 
print id(eye[0]) 
print id(eye[1]) 
print id(eye[2]) 

輸出繼電器:你可以用一個列表理解如下弄明白 -

139834251065392 
139834251065392 
139834251065392 

所以,當你正在做eye = [[0] * dim] * dim它實際上refrencing refrencing 3 list到這是同一個對象eye

而在其他情況下

eye2=[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
print id(eye2[1]) 
print id(eye2[2]) 
print id(eye2[0]) 

輸出中: -

139863345170480 
139863260058256 
139863260067240 

這裏每次refrence id爲不同勢。

+0

非常有說服力,謝謝 – user1502776 2014-10-28 06:24:31

+0

@ user1502776瀏覽https://docs.python.org/2/reference/datamodel.html#objects-values-and-types。這將說明它。 – 2014-10-28 06:32:25