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 = tmp 。 operator.add和operator.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。