是的,它们是编译成不同字节码的不同运算符:>>> import dis
>>> def test1(x):
... x = x + 1
...
>>> def test2(x):
... x += 1
...
>>> dis.dis(test1)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (1)
6 BINARY_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(test2)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (1)
6 INPLACE_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
在这种情况下,由于int是不可变的,所以不会有太大的区别。理论上,它们可以以不同的方式实现(取决于解释器),但这不会改变它对值的操作方式。
一般来说,它们可以被实现来做完全不同的事情(+通过魔法方法实现__add__()和+=使用__iadd()__)-例如,在大多数可变容器中,如果有不同的名称引用同一对象,则会产生巨大的差异:>>> x = []
>>> y = x
>>> x += [1]
>>> y
[1]
>>> x = x + [1]
>>> y
[1]
>>> x
[1, 1]
您可以看到,当我们将x赋给y时,它们都指向同一个列表。当我们使用+=时,我们扩展列表并同时更改。当我们给x分配一个新值时,y仍然指向原始值并且保持不变。