Why isn't operator.iadd(x, y)
equivalent to z = x; z += y
? And how does operator.iadd(x, y)
differ from operator.add(x, y)
?
From the docs:
Many operations have an “in-place” version. The following functions provide a more primitive access to in-place operators than the usual syntax does; for example, the statement x += y is equivalent to x = operator.iadd(x, y). Another way to put it is to say that z = operator.iadd(x, y) is equivalent to the compound statement z = x; z += y.
Related question, but I am not interested in Python class methods; just regular operators on built-in Python types.
Perhaps because some Python objects are immutable.
I'm guessing
operator.iadd(x, y)
is equivalent toz = x; z += y
only for mutable types like dictionaries and lists, but not for immutable types like numbers and strings.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 intmp = a + b; a = tmp
.operator.add
andoperator.iadd
differ in the same way.To the other question:
operator.iadd(x, y)
isn't equivalent toz = 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: