2012-10-30 92 views
3

可能重複:
How to clone a list in python?蟒蛇破壞性自然操作?

我發現了一些有趣的結果

a = [1, 2] 
b=a 
b.append(3) 
print a, b 

#=> [1,2,3] [1,2,3] 


a = [1, 2] 
b=a 
b += [3] 
print a, b 

#=> [1,2] [1,2,3] 

好像一些操作已經改變的參考價值,一些創建一個新的。我記得在Ruby中它可以使用!來表示哪種方法具有這種破壞性。 python有類似的方式讓我區分它們嗎?或者提供一個列表來顯示所有最常用的列表?

+0

'b + = a'運算符與'b = b + a'相同,其中'+'是連接,它會創建一個新對象。 Python文檔是你唯一的朋友。 – dzonder

+0

@PaoloMoretti,我不認爲這是重複的,但鏈接的問題是對這個問題的回答。 – Willy

+0

@dzonder:這是明確提到的地方?因爲根據[數據模型文檔](http://docs.python.org/2/reference/datamodel.html#object.__iadd__):*「這些方法應該嘗試就地操作(修改自我)並返回結果(可能是,但不一定是自己)「*。但對於序列類型可能不同...... –

回答

-1

沒有命名約定。

但是,其用途是修改對象的方法返回None,創建新對象的方法將返回所述對象。

1

與這裏的一些已有的答案相反,真正的原因其實是相反的。 +=是爲了在Python中修改self的就地操作符。但有一些趕上它。


恆定類型如元組和字符串,my_tuple += (1,)相當於my_tuple = my_tuple + (1,)它創建一個對象然後將其分配給my_tuple

>>> my_tuple = (1,2,3) 
>>> t = my_tuple 
>>> t += (2,) 
>>> t 
(1, 2, 3, 2) 
>>> my_tuple 
(1, 2, 3) 

這是因爲不可變類型,例如元組和字符串不會執行__iadd__(例如,您可以通過dir(tuple)進行檢查)。而在這種情況下,它將回退使用__add__。這將創建一個新對象並將其分配給原始變量。


對於某些可變類型如列表和字典,但是,__iadd__實現,並+=將與其說這是:

>>> inspect.getdoc(list.__iadd__) 
'x.__iadd__(y) <==> x+=y' 

>>> a = [1,2,3] 
>>> b = a 
>>> b += [4] 
>>> b 
[1, 2, 3, 4] 
>>> a 
[1, 2, 3, 4] 

所以對於可變類型,則執行該就地操作(通過修改self)和original object will be updated

+1

您的最後一句話似乎不正確。 'list'確實實現了'__iadd__','list .__ add__'和'extend'不一樣。 'list .__ iadd__'(幾乎)與'extend'相同。 – interjay

+0

@interjay你是對的,它應該是沒有實現它的'元組'。我更新了我的答案以糾正它。謝謝你的收穫! –