2011-01-23 63 views
7

爲什麼不是operator.iadd(x, y)相當於z = x; z += yoperator.iadd(x, y)operator.add(x, y)有什麼不同?Python就地操作符函數如何與標準操作符函數不同?

docs

很多操作有一個「就地」 版本。與通常的 語法相比,以下函數 提供了對原地操作符的更原始訪問: ;例如, 聲明x + = y等於x = operator.iadd(x,y)。 的另一種說法就是說z = operator.iadd(x,y)等於 複合語句z = x; z + = y。

Related question,但我對Python類方法不感興趣;只是內置Python類型的常規運算符。

回答

21

首先,您需要了解__add____iadd__之間的區別。

對象的__add__方法是常規加法:它接受兩個參數,返回它們的和,並且不修改任一參數。

一個對象的__iadd__方法也需要兩個參數,但在原地進行更改,修改第一個參數的內容。因爲這需要對象變異,所以不可變類型(如標準數字類型)不應該有__iadd__方法。

a + b使用__add__。如果它存在,則使用使用__iadd__;如果沒有,則通過__add__模擬它,如tmp = a + b; a = tmpoperator.addoperator.iadd以相同的方式不同。

另一個問題:operator.iadd(x, y)不等於z = x; z += y,因爲如果沒有__iadd__存在__add__將被用來代替。您需要分配值以確保結果存儲在兩種情況下:x = operator.iadd(x, y)

你可以看到這個自己很輕鬆地:

import operator 
a = 1 
operator.iadd(a, 2) 
# a is still 1, because ints don't have __iadd__; iadd returned 3 

b = ['a'] 
operator.iadd(b, ['b']) 
# lists do have __iadd__, so b is now ['a', 'b'] 
+0

http://docs.python.org/2/reference/datamodel.html#object.__iadd__ 注意,增強作業可以,但不具備在原地修改對象 – lig 2014-02-25 16:47:21

0

也許是因爲一些Python對象是不可變的。

我猜operator.iadd(x, y)相當於z = x; z += y只適用於可變類型,如字典和列表,但不適用於像數字和字符串這樣的不可變類型。