与这里的一些现有答案相反,真正的原因实际上恰恰相反。+=
旨在成为在 Python中修改self的就地运算符。但有一些问题。
对于元组和字符串等不可变类型,my_tuple += (1, )
相当于my_tuple = my_tuple + (1, )
创建一个新对象然后将其分配给my_tuple
:
>>> my_tuple = (1,2,3)
>>> t = my_tuple
>>> t += (2,)
>>> t
(1, 2, 3, 2)
>>> my_tuple
(1, 2, 3)
这是因为元组和字符串等不可变类型没有实现__iadd__
(dir(tuple)
例如,您可以检查)。在这种情况下,它会退回使用__add__
。这将创建一个新对象并将其分配给原始变量。
但是,对于某些可变类型(例如列表和字典),__iadd__
已实现,并将+=
改为调用它:
>>> inspect.getdoc(list.__iadd__)
'x.__iadd__(y) <==> x+=y'
>>> a = [1,2,3]
>>> b = a
>>> b += [4]
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
所以对于可变类型,这个就地操作被执行(通过修改self)并且原始对象将被更新。