Python就地运算符函数与标准运算符函数有什么不同?

为什么不是operator.iadd(x, y)等于z = x; z += y z = x; z += y operator.iadd(x, y)operator.add(x, y)什么不同?

从文档 :

许多操作都有一个“就地”版本。 下面的函数比常用的语法提供了对原地操作符的更原始的访问; 例如,语句x + = y等价于x = operator.iadd(x,y)。 另一种说法是z = operator.iadd(x,y)等价于复合语句z = x; z + = y。

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

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

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

一个对象的__iadd__方法也有两个参数,但在原地进行更改,修改第一个参数的内容。 因为这需要对象变异,所以不可变types(如标准数字types)不应该有__iadd__方法。

a + b使用__add__a += b如果存在则使用__iadd__ ; 如果没有,则通过__add__模拟它,如tmp = a + b; a = tmp tmp = a + b; a = tmpoperator.addoperator.iadd在相同的方面有所不同。

对另一个问题: operator.iadd(x, y)不等于z = x; z += y z = x; z += y ,因为如果不存在__add__则将使用__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'] 

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

我猜operator.iadd(x, y)等价于z = x; z += y z = x; z += y仅适用于字典和列表等可变types,但不适用于数字和string等不可变types。