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