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 = tmpoperator.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']