我有以下代码:
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
)。