Python之 += or *=

+=: 背后的特殊方法是__iadd__(用于“就地加法”)。但是如果一个类没有实现这个方法的话,Python 会退一步调用__add__。

*=:后者相对应的是__imul__

**如果a 实现了__iadd__ 方法: **

就会调用这个方法。同时对可变序列( 例如list、bytearray 和array.array)来说,a 会就地改动,就像调用了a.extend(b) 一样。

如果a 没有实现__iadd__ 的话:

a+= b 这个表达式的效果就变得跟a = a + b 一样了:首先计算a + b,得到一个新的对象,然后赋值给a。也就是说,在这个表达式中,变量名会不会被关联到新的对象,完全取决于这个类型有没有实现__iadd__ 这个方法。

总体来讲,可变序列一般都实现了__iadd__ 方法,因此+= 是就地加法。而不可变序列根本就不支持这个操作,对这个方法的实现也就无从谈起。

对不可变序列进行重复拼接操作的话,效率会很低,因为每次都有一个新对象,而解释器需要把原来对象中的元素先复制到新的对象里,然后再追加新的元素。

ps:str 是一个例外,因为对字符串做+= 实在是太普遍了,所以CPython 对它做了优化。为str 初始化内存的时候,程序会为它留出额外的可扩展空间,因此进行增量操作的时候,并不会涉及复制原有字符串到新位置这类操作


Python之 += or *=
https://centyuan.github.io/2023/11/06/Python从入门到放弃/Python之 += or =/
作者
hlyuan
发布于
2023年11月6日
许可协议