关于python:list.__iadd__ 和 list.__add__的不同行为

Different behaviour for list.__iadd__ and list.__add__

请考虑以下代码:

1
2
3
4
5
6
>>> x = y = [1, 2, 3, 4]
>>> x += [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4, 4]

然后考虑一下:

1
2
3
4
5
6
>>> x = y = [1, 2, 3, 4]
>>> x = x + [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4]

为什么这两者有区别?

(是的,我试着找这个)。


__iadd__使列表发生变异,而__add__返回一个新的列表,如图所示。

x += y的一个表达式首先试图调用__iadd__,如果没有调用__add__,则调用__add__,然后执行了一个分配(请参阅sven的评论以获得一个小的更正)。既然list__iadd__,那么它就有了这个小小的"o"突变魔法。


第一个改变列表,第二个重新绑定名称。