First, you need to understand the difference between __add__
and __iadd__
.
An object's __add__
method is regular addition: it takes two parameters, returns their sum, and doesn't modify either parameter.
An object's __iadd__
method also takes two parameters, but makes the change in-place, modifying the contents of the first parameter. Because this requires object mutation, immutable types (like the standard number types) shouldn't have an __iadd__
method.
a + b
uses __add__
. a += b
uses __iadd__
if it exists; if it doesn't, it emulates it via __add__
, as in tmp = a + b; a = tmp
. operator.add
and operator.iadd
differ in the same way.
To the other question: operator.iadd(x, y)
isn't equivalent to z = x; z += y
, because if no __iadd__
exists __add__
will be used instead. You need to assign the value to ensure that the result is stored in both cases: x = operator.iadd(x, y)
.
You can see this yourself easily enough:
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']
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…