Python就地操作符函数与标准操作符函数有何不同?

时间:2011-01-23 08:44:35

标签: python function operator-keyword

为什么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类型的常规运算符。

2 个答案:

答案 0 :(得分:25)

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

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

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

a + b使用__add__a += b使用__iadd__(如果存在);如果没有,则通过__add__模拟它,如tmp = a + b; a = tmp中所示。 operator.addoperator.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,只适用于字典和列表等可变类型,但不适用于数字和字符串等不可变类型。