在python中更改二维列表中的特定元素

时间:2012-06-06 00:14:05

标签: python list

我有以下代码:

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]]

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

感谢您的帮助!

3 个答案:

答案 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”的事实并不重要; 00,无法更改。写a[0][0] = 1 替换 0,但修改包含[0, 0]的{​​{1}}(因为替换了0 )。