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

mat*_*sco 4 python

我总是这么认为

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].在后面,创建一个新列表并将其分配给变量.

  • 我会想象这种行为是故意的.它允许您仅通过更改操作符来区分这两个操作; 而且,如果我可以这样说,用法看似直观. (4认同)
  • `def __iadd __(self,other):self.extend(other); 实际上,回归自我. (2认同)