我發現了一些有趣的結果
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有類似的方式讓我區分它們嗎?或者提供一個列表來顯示所有最常用的列表?
我發現了一些有趣的結果
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有類似的方式讓我區分它們嗎?或者提供一個列表來顯示所有最常用的列表?
沒有命名約定。
但是,其用途是修改對象的方法返回None,創建新對象的方法將返回所述對象。
與這裏的一些已有的答案相反,真正的原因其實是相反的。 +=
是爲了在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。
您的最後一句話似乎不正確。 'list'確實實現了'__iadd__','list .__ add__'和'extend'不一樣。 'list .__ iadd__'(幾乎)與'extend'相同。 – interjay
@interjay你是對的,它應該是沒有實現它的'元組'。我更新了我的答案以糾正它。謝謝你的收穫! –
'b + = a'運算符與'b = b + a'相同,其中'+'是連接,它會創建一個新對象。 Python文檔是你唯一的朋友。 – dzonder
@PaoloMoretti,我不認爲這是重複的,但鏈接的問題是對這個問題的回答。 – Willy
@dzonder:這是明確提到的地方?因爲根據[數據模型文檔](http://docs.python.org/2/reference/datamodel.html#object.__iadd__):*「這些方法應該嘗試就地操作(修改自我)並返回結果(可能是,但不一定是自己)「*。但對於序列類型可能不同...... –