我总是这么认为
x += y
Run Code Online (Sandbox Code Playgroud)
只是一个捷径
x = x + y
Run Code Online (Sandbox Code Playgroud)
但似乎不是列表的情况:
x = []
x2 = x
print x is x2
True
x += [2]
print x is x2
True
x = x + [2]
print x is x2
False
Run Code Online (Sandbox Code Playgroud)
mat*_*sco 10
这是因为x + = y不仅仅是x = x + y的快捷方式.
当运算符的left-value是属于我们定义的类的对象时,有一个名为__iadd__ 的Python 魔术方法可以替换+ =的默认行为.
因此,似乎Python内置类型列表实现了__iadd__,如下所示:
def __iadd__(self, other):
for x in other:
self.append(x)
Run Code Online (Sandbox Code Playgroud)
这样,由于+=
避免了默认行为,因此不会创建新列表,这就是为什么x
在之后x += [2]
但没有之后指向同一个对象的原因x = x + [2]
.在后面,创建一个新列表并将其分配给变量.