2012-04-17 314 views
1

可能重复:
Python list problem奇怪的行为

我不明白列出的行为在Python:

>>> a1 = [[0,0],[0,0]] 
>>> a2 = [[0]*2]*2 
>>> a1 
[[0, 0], [0, 0]] 
>>> a2 
[[0, 0], [0, 0]] 
>>> a1[0][0] = 1 
>>> a2[0][0] = 1 
>>> a1 
[[1, 0], [0, 0]] 
>>> a2 
[[1, 0], [1, 0]] 

为什么一个要素分配影响到另一个元素?感谢您的回答!

+0

相关Python关于[多维列表]的FAQ(http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) – 2012-04-17 13:00:28

回答

6

当您乘以一个列表时,它将引用复制到列表中,但不创建列表的副本。由于列表是可变的,因此当您更改它时,所有对它的引用都会被更改。

在ASCII艺术方面:

a1 --- [list1, list2] --- list1 = [0, 0] 
         --- list2 = [0, 0] 

a2 --- [list3, list3] --- list3 = [0, 0] 

你可以清楚地看到,改变项目list3会影响两个位置。

如果不想复制引用创建可变长度的名单,则应该做这样的事情:

>>> a2 = [[0]*2 for _ in range(2)] 
>>> a2[0][0] = 1 
>>> a2 
[[1, 0], [0, 0]] 

这里,以创造新的元素各一次,而不是复制我们使用的是list comprehension引用旧元素。在更复杂的情况下,如果您想要重复存在可变对象,则可能需要使用the copy module

注意[0]*2操作仍然可以,因为Python中的int是不可变的,并且不能更改,所以如果您有对同一对象的引用并不重要。

+0

非常感谢您的回答。这是我的秋天。我试图找到答案docs.python.org但没有找到。对不起,这个非常简单的问题。 – maxsocl 2012-04-17 13:06:16

+0

@misokolsky如果这回答你的问题,请随时[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)。 – 2012-04-17 13:07:08