2012-11-11 50 views
2

可能重複:
What does plus equals (+=) do in Python?l1是一個列表,l2 = l1;爲什麼「l2 = l2 + [item]」會影響l1而「l2 + = [item]」呢?

我注意到一個奇怪的問題:

l1 = ['1', '2', '3'] 
    l2 = l1 

    item = l2.pop(0) 
    # the pop operation will effect l1 
    print l1 

    l2 = l2 + [item] 
    # why "l2 = l2 + [item]" does't effect l1 while "l2 += [item]" does. 
    print l2 
    print l1 

輸出是:

['2', '3'] 
['2', '3', '1'] 
['2', '3'] 

但是如果我改變l2 = l2 + [item]l2 += [item],輸出將是:

['2', '3'] 
['2', '3', '1'] 
['2', '3', '1'] 
+2

這是怎麼回事?這只是它的方式。 – phant0m

回答

5

++=是不同運營商的不同woth內部含義描述here

l2 = l1 + x來電l2 = l1.__add__(x),如果不起作用,它會調用x.__radd__(l1)。兩者都應返回形成操作結果的新對象,獨立於舊對象,因此不會影響l1

l2 += x調用l2 = l2.__iadd__(x)(「增強作業」),並且只有當這不起作用時,如上所述回落到l2 = l2 + x

隨着數字,兩者是相同的,因爲它們是不可變的,因此不能用+=被修改,而在列表,+返回一個新對象,同時+=修改左手側的一個。

由於l2背後的對象被修改,並且l1引用同一個對象,所以您也注意到l1上的更改。

1

後分配l2 = l1l2相同l1。 以下pop操作同時影響l1l2,因爲它們是相同的。

l2 = l2 + [item]創建一個新列表。所以l2現在是一個不同的對象。

l2 += [item]修改l2 inplace。所以l2指向與l1相同的東西。

你的代碼執行的交互式可視化:

一些相關鏈接:

+0

請注意,OP沒有要求解釋。他說他「注意到了一個問題」...... – phant0m

+0

@ phant0m對。因爲他不明白事情是如何運作的。所以解釋他們是要做的事情。 – glglgl

+1

@glglgl這是一種奇怪的方式讓你不理解某些東西......但是,他確實觀察到了差異,接受的答案也不能解釋這一點。另一方面,你的實際提供了更多的細節。 – phant0m

相關問題