1

我有以下代码:

a=[[0]*2]*3

print a


a[1][1]=2
print a

输出是:

[[0,0],[0,0],[0,0]]
[[0,2],[0,2],[0,2]]

为什么要更改列表的所有元素?

输出不应该是:

[[0,0],[0,2],[0,0]]

如果我只想更改其中一个元素,需要做什么?

谢谢您的帮助!

4

3 回答 3

3

当您这样做时[0] * 2,这会生成列表[0, 0]。当您将其乘以 3 时,您将创建一个包含对该列表的三个引用的列表。您可能想要这样做:

a = [[0] * 2 for _ in range(3)]
于 2012-06-06T00:17:31.127 回答
2

我已经多次看到这个问题,这令人沮丧。

当你这样做时:

a = [[0] * 2] * 3

您创建一个列表[0, 0]并将其引用三次传递给 form a。那些克隆的列表只是对原始列表对象的引用。当你修改一个时,你修改了原来的,其余的也被修改了。

解决方案非常简单:

a = [[0 for j in range(2)] for i in range(3)]

您每次都创建一个新列表,而不是通过引用传递列表。

于 2012-06-06T00:17:40.473 回答
2

为什么要更改列表的所有元素?

因为它们都是相同的元素。

如果我只想更改其中一个元素,需要做什么?

您需要创建一个包含三个不同实例的列表[0, 0]

将列表相乘会生成一个多次引用相同事物的列表。

例如,尝试[[0] * 2 for _ in range(3)].

没有问题的原因是[0] * 2两个元素“相同0”这一事实并不重要。00,不能改变。书写a[0][0] = 1 替换了 0,但修改[0, 0]包含那个0(通过替换0)。

于 2012-06-06T00:18:53.807 回答