增量运算符+=和*=的原理与不可变序列增量运算效率低的原因
一、原理
例如:
>>> a=1
>>> a+=1
>>> a
2
在 a+=b 中
+=背后其实是__iadd__方法,用于就地加法。
对于可变序列(例如list、bytearray、array.array)来说,a会就地改动,类似于调用了a.extend(b一样)
而*+取决于这个类是否实现了 __imul__方法。
二、对于不可变序列低效原因
>>> l=[1,2,3]
>>> id(l)
2613324000200
>>> l*=2
>>> l
[1, 2, 3, 1, 2, 3]
>>> id(l)
2613324000200
>>>
1、可变序列进行增量运算,内存地址不变
>>> t=(1,2,3)
>>> id(t)
2613324034408
>>> t*=2
>>> t
(1, 2, 3, 1, 2, 3)
>>> id(t)
2613321738568
2、对于不可变序列、例如元组,需要把原来对象中的元素先复制到新的对象,然后再追加新的元素。因此对不可逆序列增量运算效率低。
str是个例外,Cpython对它进行了优化,+=字符串串接操作时,str初始化内存的时候,程序已经为str预留了可拓展空间。