不同之处在于,一个修改数据结构本身(就地操作),
b += 1而另一个仅 重新分配 变量
a = a + 1。
仅出于完整性考虑:
x += y是 不是总是 做就地操作,有(至少)三种例外情况:
如果
x
没有实现 的__iadd__
则方法的x += y
声明仅仅是一个速记x = x + y
。如果x
是类似的情况就是这种情况int
。如果
__iadd__
返回NotImplemented
,Python将退回到x = x + y
。从
__iadd__
理论上讲,该方法可以实现为无法正常运行。但是,这样做真的很奇怪。
发生时,您的
bs是
numpy.ndarray实现
__iadd__并返回自身的,因此您的第二个循环就地修改了原始数组。
您可以在Python文档“模拟数字类型”中了解更多信息。
这些[
__i*__]方法称为实现增强算术分配(+=,-=,*=,@=,/=,//=,%=,**=,<<=,>>=,&=,^=,|=)。这些方法应尝试就地执行操作(修改self)并返回结果(可以是,但不一定是self)。如果未定义特定方法,则扩展分配将退回到常规方法。例如,如果x是具有__iadd__()方法的类的实例,x+= y则等效于x = x.__iadd__(y)。否则,将x.__add__(y)与和y.__radd__(x)一起评估x +y。在某些情况下,扩充分配可能会导致意外错误(请参见为什么a_tuple[i] +=["item"]加法有效时会引发异常?),但实际上,该行为是数据模型的一部分。



