1

我昨天问了一个关于初始化二维数组的问题,这是链接: How to implement this C++ source in python?

回答有问题,有朋友提了一个办法:

G = [[0]*11]*11

但是这样,当我将 to 更改为G[0][0]2,所有的G[i][0](0<=i<11)都会更改为2,但我不知道为什么?

补充:

这就是我的想法:0或其他数字是immutable,所以我们改变其中一个,其他的不会改变。但是列表 [0, 0 ,0 ,.....] 是mutable,所以当我们 [0, 0, ...] * 11 时,所有的 [0, 0, ...] 列表都是一样的,因为is函数为真。我对吗?

4

2 回答 2

4

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

G = [[0] * 11 for x in range(11)]
于 2012-04-14T00:16:36.000 回答
2

*11符号对同一对象进行了 11 次引用。如果对象是不可变的,您不会注意到,因为任何更改它的尝试都会更改对不同对象的引用。当对象是可变的时,您可以修改它,例如分配给列表的成员;由于所有引用都指向同一个对象,因此它们都会同时被修改。

可变/不可变似乎会改变一些事情,但事实并非如此——Python 在这两种情况下都是一致的。考虑这个例子:

G[0] = [3]*11

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

于 2012-04-14T00:55:47.700 回答