我注意到一个奇怪的问题:
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']
答案 0 :(得分:5)
+
和+=
是不同的运算符,具有不同的内部含义,如here所述。
l2 = l1 + x
来电l2 = l1.__add__(x)
,如果不能,则调用x.__radd__(l1)
。两者都应该返回一个形成操作结果的新对象,与旧的对象无关,因此不会影响l1
。
l2 += x
来电l2 = l2.__iadd__(x)
("扩充作业"),并且只有在不起作用的情况下,如上所述回退到l2 = l2 + x
。< / p>
对于数字,两者都是相同的,因为它们是不可变的,因此无法使用+=
进行修改,而在列表中,+
会返回一个新对象,而+=
会修改左手一方。
由于修改了l2
后面的对象并且l1
引用了同一个对象,因此您也注意到l1
上的更改。
答案 1 :(得分:1)
分配l2 = l1
后,l2
与l1
相同。
以下pop
操作会影响l1
和l2
,因为它们是相同的。
l2 = l2 + [item]
创建一个新列表。所以l2
现在是另一个对象。
l2 += [item]
修改l2
到位。因此l2
指向与l1
相同的内容。
代码执行的交互式可视化:
一些相关链接: