2012-04-14 149 views
1

我問一個問題關於初始化二維數組昨天初始化,這是鏈接: How to implement this C++ source in python?2維數組的蟒蛇

有在回答一個問題,一個朋友提到的方式:

G = [[0]*11]*11 

但這種方式,當我改變了G[0][0]2,所有的G[i][0](0<=i<11)都將改變2,但我不知道爲什麼?

補充:

這就是我想: 的0或其他號碼是immutable,所以我們改變了其中的一個,其他人將不會被改變。 但是列表[0,0,0,...]是mutable,所以當我們[0,0,...] * 11時,所有[0,0,...]列表將是相同,因爲is函數爲真。我對嗎?

回答

4

因爲您對同一個列表有11個引用。

G = [[0] * 11 for x in range(11)] 
+0

我在quetion中添加補充,是不是? – 2012-04-14 00:37:56

+0

你的結論是正確的。 – 2012-04-14 02:24:56

2

*11表示法對同一對象引用11次引用。如果對象是不可變的,你不會注意到,因爲任何改變它的嘗試都會改變對不同對象的引用。當對象是可變的時,你可以修改它,例如分配給列表的成員;由於所有引用都是針對同一個對象的,因此所有引用都會同時進行修改。

可變/不可變可能會改變事情,但它不會 - 在兩種情況下,Python都是一致的。考慮這個例子:

G[0] = [3]*11 

你會看到G [1]沒有改變。

+0

對不起,我不知道「可變/不可變可能會改變事情,但事實並非如此 - Python在這兩種情況下都是一致的」,這意味着什麼?爲什麼「,因爲所有的引用都是同一個對象,所有的引用都被同時修改」 – 2012-04-14 09:10:22