为什么operator.iadd(x, y)
不等同于z = x; z += y
? operator.iadd(x, y)
与operator.add(x, y)
的区别?
来自docs:
许多业务都有“就地” 版。以下功能 提供更原始的访问权限 就地操作员比平常 语法呢;例如, 语句x + = y等于x = operator.iadd(x,y)。另一种方式 这就是说z = operator.iadd(x,y)等价于 复合语句z = x; z + = y。
Related question,但我对Python类方法不感兴趣;只是内置Python类型的常规运算符。
答案 0 :(得分:25)
首先,您需要了解__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']
答案 1 :(得分:0)
也许是因为某些Python对象是不可变的。
我猜operator.iadd(x, y)
仅相当于z = x; z += y
,只适用于字典和列表等可变类型,但不适用于数字和字符串等不可变类型。