可能的重复:
加号等于(+=)在Python中做什么?
我注意到一个奇怪的问题:
l1 = ['1', '2', '3']
l2 = l1
item = l2.pop(0)
# the pop operation will effect l1
print l1
l2 = l2 + [item]
# why "l2 = l2 + [item]" does't effect l1 while "l2 += [item]" does.
print l2
print l1
输出为:
['2', '3']
['2', '3', '1']
['2', '3']
但是如果我将l2 = l2 + [item]
更改为l2 += [item]
,则输出将为:
['2', '3']
['2', '3', '1']
['2', '3', '1']
+
和+=
是不同的运算符,具有不同的内部含义,如此处所述。
l2 = l1 + x
调用l2 = l1.__add__(x)
,如果这不起作用,它会调用x.__radd__(l1)
。两者都应该返回一个形成操作结果的新对象,独立于旧对象,因此不会影响l1
。
l2 += x
调用l2 = l2.__iadd__(x)
("增强分配"),并且只有在这不起作用时才会回退到如上所述的l2 = l2 + x
。
对于数字,两者都是相同的,因为它们是不可变的,因此不能用+=
修改,而在列表中,+
返回一个新对象,而+=
修改左侧的对象。
当l2
后面的对象被修改并且l1
引用同一对象时,您也会注意到l1
上的更改。
分配l2 = l1
后,l2
与l1
相同。 以下pop
操作会影响l1
和l2
,因为它们是相同的。
l2 = l2 + [item]
创建一个新列表。所以l2
现在是一个不同的对象。
l2 += [item]
修改l2
就地。所以l2
指向与l1
相同的事情.
代码执行的交互式可视化:
- 第一
- 第二
一些相关链接:
-
Python 中的名称。
-
有关列表的更多信息