我一直认为
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
答案 0 :(得分:10)
这是因为x + = y不仅仅是x = x + y的快捷方式。
当运算符的左值是属于我们定义的类的对象时,有一个名为__iadd__的Python magic method可以替换 + = 的默认行为。
因此,似乎Python内置类型列表实现__iadd__如下:
def __iadd__(self, other):
for x in other:
self.append(x)
这样,由于避免了+=
的默认行为,因此没有创建新列表,这就是x
在x += [2]
之后但在{{1}之后没有指向同一对象的原因}}。在后面,创建一个新列表并将其分配给变量。