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。