python中初始化二维数组

时间:2012-04-14 00:14:24

标签: python arrays initialization

我昨天问了一个关于初始化二维数组的问题,这是链接: 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函数是真的。我是对的吗?

2 个答案:

答案 0 :(得分:4)

因为您有11个对同一列表的引用。

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

答案 1 :(得分:2)

*11表示法对同一个对象进行11次引用。如果对象是不可变的,则您不会注意到,因为任何更改它的尝试都会将引用更改为其他对象。当对象是可变的时,你可以修改它,比如分配给列表的成员;由于所有引用都属于同一个对象,因此所有引用都会同时被修改。

Mutable / immutable似乎可以改变一些东西,但事实并非如此 - 在这两种情况下Python都是一致的。考虑这个例子:

G[0] = [3]*11

你会看到G [1]没有改变。