2012-08-24 154 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