Python就地运算符函数与标准运算符函数有何不同?
问题内容:
从文档:
许多操作都有“就地”版本。与通常的语法相比,以下函数提供了对原位运算符的更原始的访问;例如,语句x + = y等效于x =
operator.iadd(x,y)。另一种表达方式是说z = operator.iadd(x,y)等效于复合语句z = x; z + = y。
问题:
-
为什么不
operator.iadd(x, y)
等于z = x; z += y
? -
如何
operator.iadd(x, y)
从不同operator.add(x, y)
?
相关问题,但是我对Python类方法不感兴趣。只是内置Python类型的常规运算符。
问题答案:
首先,你需要明白之间的差别__add__
和__iadd__
。
对象的__add__
方法是常规加法:它接受两个参数,返回它们的总和,并且不修改任何一个参数。
对象的__iadd__
方法也有两个参数,但是就地进行更改,从而修改了第一个参数的内容。因为这需要对象突变,所以不可变类型(如标准数字类型)不应具有__iadd__
方法。
a + b
用途__add__
。 a += b
使用(__iadd__
如果存在);如果没有,它将通过进行仿真__add__
,如中所示tmp = a + b; a = tmp
。 operator.add
并operator.iadd
以相同的方式有所不同。
另一个问题operator.iadd(x, y)
是:不等于z = x; z += y
,因为如果不__iadd__
存在,__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']