1. 增量赋值操作
如 *= +=
2. 可变序列和不可变序列对于增量赋值的实现
对于可变序列,如list,bytearrary和array.aray(实现了__iadd__, __imul__,就地运算),增量运算后,新元素追加到可变序列后,该序列的ID不变
对于不可变序列,没有实现上述方法,就需要创建个新对象,然后赋值,如a+=b,相当于a=a+b
例子:
>>> l=[1,2,3]
>>> id(l)
47410632218312
>>> l*=2
>>> id(l)
47410632218312
>>> l
[1, 2, 3, 1, 2, 3]
>>> t=(1,2,3)
>>> id(t)
47410559333872
>>> t*=3
>>> id(t)
47410627604688
>>> t
(1, 2, 3, 1, 2, 3, 1, 2, 3)
对不可变序列进行重复拼接操作的话,效率会很低,因为每次都要新创建一个对象,解释器需要把原来对象中的元素先复制到新的对象里,然后再追加新的元素。
3. 注意
str 是个例外,因为对字符串做+=太普遍,所以CPython对它进行了优化。为str初始化内存的时候,程序会为它留出额外的可扩展空间,因此增量操作的时候,并不会涉及复制原有字符串到新对象的操作。
增量赋值不是一个原子操作,例子如下,虽然会报错,但还是完成了操作:
>>> t
(1, 2, [10, 20])
>>> t[2]+=[30,40]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(1, 2, [10, 20, 30, 40])