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

时间:2012-03-19 07:22:19

标签: python list

考虑以下代码:

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

然后考虑一下:

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

为什么这两者有区别?

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

3 个答案:

答案 0 :(得分:26)

__iadd__会改变列表,而__add__会返回 new 列表,如图所示。

表达式x += y首先尝试调用__iadd__,如果失败,则调用__add__跟随作业(请参阅Sven的评论进行小修正)。由于list__iadd__,所以它会做一点“变异魔法”。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

1)'+ ='调用 就地 添加,即 iadd 方法。此方法采用两个参数,但是就地进行更改,修改了第一个参数的内容(即x被修改)。由于x和y都指向同一个Pyobject,因此它们都是相同的。

2)x = x + [4]调用 add mehtod(x。 add ([4])),而不是在-放置它会创建一个新列表,现在和y都指向old_list。