Python就地操作符函数与标准操作符函数有何不同?

How are Python in-place operator functions different than the standard operator functions?

为什么operator.iadd(x, y)不等于z = x; z += y?那么,operator.iadd(x, y)operator.add(x, y)有什么区别呢?

从文档中:

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.

相关问题,但我对Python类方法不感兴趣;只对内置的Python类型使用常规运算符。


首先,您需要了解__add____iadd__之间的区别。

对象的__add__方法是常规加法:它接受两个参数,返回它们的和,并且不修改任何一个参数。

一个对象的__iadd__方法也有两个参数,但是会进行相应的更改,修改第一个参数的内容。因为这需要对象突变,不可变类型(如标准数字类型)不应该有__iadd__方法。

a + b使用__add__a += b如果存在,使用__iadd__;如果不存在,则通过__add__模拟,如tmp = a + b; a = tmp所示。operator.addoperator.iadd的区别相同。

另一个问题是:operator.iadd(x, y)不等于z = x; z += y,因为如果没有__iadd__存在,将使用__add__代替。您需要分配该值以确保结果存储在这两种情况下:x = operator.iadd(x, y)

你可以很容易地看到这一点:

1
2
3
4
5
6
7
8
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']


可能是因为一些Python对象是不可变的。

我猜operator.iadd(x, y)只相当于z = x; z += y,只适用于字典和列表之类的可变类型,而不适用于数字和字符串之类的不可变类型。