为什么'x + = y'并不总是与Python(2.7)中的'x = x + y'相同?

时间:2015-08-19 02:52:09

标签: python

我一直认为

x += y

只是

的捷径
x = x + y

但似乎不是列表的情况:

x = []

x2 = x

print x is x2
True

x += [2]

print x is x2
True

x = x + [2]

print x is x2
False

1 个答案:

答案 0 :(得分:10)

这是因为x + = y不仅仅是x = x + y的快捷方式。

当运算符的左值是属于我们定义的类的对象时,有一个名为__iadd__的Python magic method可以替换 + = 的默认行为。

因此,似乎Python内置类型列表实现__iadd__如下:

def __iadd__(self, other):
    for x in other:
        self.append(x)

这样,由于避免了+=的默认行为,因此没有创建新列表,这就是xx += [2]之后但在{{1}之后没有指向同一对象的原因}}。在后面,创建一个新列表并将其分配给变量。