list .__ iadd__和list .__ add__的不同行为

S S*_*ngh 12 python list

考虑以下代码:

>>> x = y = [1, 2, 3, 4]
>>> x += [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4, 4]
Run Code Online (Sandbox Code Playgroud)

然后考虑这个:

>>> x = y = [1, 2, 3, 4]
>>> x = x + [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

为什么这两个有区别?

(是的,我试着寻找这个).

小智 28

__iadd__改变列表,然后__add__返回一个列表,如图所示.

一个表达式x += y首先尝试调用,__iadd__并且在调用失败后,调用__add__遵循一个赋值(请参阅Sven的注释以进行小修正).既然list__iadd__那么它Ø突变魔术这一点".

  • 这个答案有点误导:无论是否调用`__iadd__()`或`__add__()`,分配总是被执行。不过,“list.__iadd__()”只是返回“self”,因此除了将目标名称渲染到当前作用域本地之外,赋值没有任何效果。 (3认同)
  • 如果您想了解有关此确切行为的更多详细信息以及有关Python为何如此的其他见解-我强烈建议您使用PyCon的[python epiphanies talk](http://pyvideo.org/video/613/python-epiphanies) 2012年。它将导致您很多“哈哈”!片刻。 (2认同)

Ign*_*ams 5

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