Python列表问题

时间:2009-12-24 20:57:25

标签: python list

蟒:

m=[[0]*3]*2
for i in range(3):
    m[0][i]=1

print m

我希望此代码可以打印

[[1, 1, 1], [0, 0, 0]]

但打印

[[1, 1, 1], [1, 1, 1]] 

2 个答案:

答案 0 :(得分:15)

这是设计的。当您对列表的元素使用乘法时,您将再现参考。

请参阅the section "List creation shortcuts" on the Python Programming/Lists wikibook,其中详细介绍了对可变对象的列表引用的问题。

他们推荐的解决方法是列表理解:

>>> s = [[0]*3 for i in range(2)]
>>> s
[[0, 0, 0], [0, 0, 0]]
>>> s[0][1] = 1
>>> s
[[0, 1, 0], [0, 0, 0]]

答案 1 :(得分:7)

这有点恶魔,但是当你明白自己在做什么时,这一点非常明显。当你执行[[0]*3]*2位时,你首先要创建一个包含3个零的列表,然后复制它以生成两个元素。但是,当您执行该复制时,不会创建具有相同内容的新列表,而是多次引用相同的列表。所以当你换一个时,它们都会改变。

突出显示它的一个例子:

In [49]: s = [[]]*2 # Create two empty lists

In [50]: s # See: 
Out[50]: [[], []]

In [51]: s[0].append(2) # Alter the first element (or so we think)

In [52]: s # OH MY, they both changed! (because they're the same list!)
Out[52]: [[2], [2]]