2012-04-14 110 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