我昨天问了一个关于初始化二维数组的问题,这是链接: How to implement this C++ source in python?
答案中有一个问题,朋友提到了一个方法:
G = [[0]*11]*11
但是通过这种方式,当我将G[0][0]
更改为2
时,所有G[i][0](0<=i<11)
都将更改为2
,但我不知道为什么?< / p>
补充:
这就是我的想法:
0
或其他号码为immutable
,因此我们会更改其中一个,其他号码不会更改。
但是列表[0,0,0,.....]是mutable
,所以当我们[0,0,...] * 11时,所有[0,0,...]列表将是相同的,因为is
函数是真的。我是对的吗?
答案 0 :(得分:4)
因为您有11个对同一列表的引用。
G = [[0] * 11 for x in range(11)]
答案 1 :(得分:2)
*11
表示法对同一个对象进行11次引用。如果对象是不可变的,则您不会注意到,因为任何更改它的尝试都会将引用更改为其他对象。当对象是可变的时,你可以修改它,比如分配给列表的成员;由于所有引用都属于同一个对象,因此所有引用都会同时被修改。
Mutable / immutable似乎可以改变一些东西,但事实并非如此 - 在这两种情况下Python都是一致的。考虑这个例子:
G[0] = [3]*11
你会看到G [1]没有改变。