增量赋值运算符+=和*=的表现取决于它们的第一个操作对象。
+=背后的特殊方法是__iadd__,用于就地加法。但是如果一个类没有实现这个方法的话,Python会退一步调用__add__。
a += b
如果a实现了__iadd__方法,就会调用这个方法。对可变序列来说,a会就地改动,就像调用了a.extend(b)一样。如果没有实现__iadd__,a += b就会变得跟a = a + b一样:首先计算a + b,得到一个新的对象,然后赋值给a。
l = [1,2,3] # id:1960196260224
l *= 2 # id:1960196260224
t = (1,2,3) # id:1960199081920
t *= 2 # id:1960196659904
"""
对不可变序列进行重复拼接操作效率会很低,因为每次都有一个新对象,
而解释器需要把原来对象中的元素先复制到新的对象里面,然后再追加新元素。
"""
PS:《流畅的Python》个人学习笔记,如果觉得不错,最好支持原书。