我有以下代码:
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]]
如果我只想更改其中一个元素,需要做什么?
谢谢您的帮助!
当您这样做时[0] * 2,这会生成列表[0, 0]。当您将其乘以 3 时,您将创建一个包含对该列表的三个引用的列表。您可能想要这样做:
a = [[0] * 2 for _ in range(3)]
我已经多次看到这个问题,这令人沮丧。
当你这样做时:
a = [[0] * 2] * 3
您创建一个列表[0, 0]并将其引用三次传递给 form a。那些克隆的列表只是对原始列表对象的引用。当你修改一个时,你修改了原来的,其余的也被修改了。
解决方案非常简单:
a = [[0 for j in range(2)] for i in range(3)]
您每次都创建一个新列表,而不是通过引用传递列表。
为什么要更改列表的所有元素?
因为它们都是相同的元素。
如果我只想更改其中一个元素,需要做什么?
您需要创建一个包含三个不同实例的列表[0, 0]。
将列表相乘会生成一个多次引用相同事物的列表。
例如,尝试[[0] * 2 for _ in range(3)].
没有问题的原因是[0] * 2两个元素“相同0”这一事实并不重要。0是0,不能改变。书写a[0][0] = 1 替换了 0,但修改了[0, 0]包含那个0(通过替换0)。