2012-08-24 155 views
-1

可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
Python list confusionPython列表混乱

我与Python中列表的列表有点摸不着头脑。我有这两个片段:

li1 = [['a'], ['a'], ['a']] 
print li1 
for i in range(0, len(li1)): 
    li1[i] += [i] 
print li1 

li2 = [['a']] * 3 
print li2 
for i in range(0, len(li2)): 
    li2[i] += [i] 
print li2 

创作LI1和LI2后是相同的,但是当我添加的元素,他们的行为不同:

[['a'], ['a'], ['a']] 
[['a', 0], ['a', 1], ['a', 2]] 
[['a'], ['a'], ['a']] 
[['a', 0, 1, 2], ['a', 0, 1, 2], ['a', 0, 1, 2]] 

可能有人请解释一下其中的诀窍是什么?

+0

我试图寻找类似的问题,但实际上可能会制定问题,所以问。 –

+0

而你没有看到几乎与你所问的问题完全相同的问题? –

回答

5

li2 = [['a']] * 3中,您创建了一个包含三个列表元素的列表,但这些列表实际上是同一个对象。这意味着:当您修改li2[0]时,您还修改了li2[1]li2[2]

以下行实际上创建了里面的三个不同的列表对象的列表:

li1 = [['a'], ['a'], ['a']] 

在这种情况下,当你修改li1[0]你只能修改该列表。其他列表不受影响。这解释了为什么您在li1li2中获得不同的列表。

1

检查每个元素的值为id(),这清楚地表明了他们行为的原因。的id()

>>> li1 = [['a'], ['a'], ['a']] 
>>> for x in li1:     #different id() 
    id(x) 


145497484 
145514156 
145511500 

价值观:

>>> li1=['a']*3 
>>> for x in li1: 
    print id(x) 


3078093024 
3078093024 
3078093024