可能重复: 加法等于(+=)在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']发布于 2012-11-11 09:43:58
+和+=是不同的运算符,有着不同的内部含义,如这里所描述的。
l2 = l1 + x调用l2 = l1.__add__(x),如果不起作用,则调用x.__radd__(l1)。两者都应该返回一个新对象,该对象与旧对象无关,因此不会影响l1。
l2 += x调用l2 = l2.__iadd__(x) (“增广赋值”),只有当这种分配不起作用时,才会回到上面描述的l2 = l2 + x。
对于数字,两者是相同的,因为它们是不可变的,因此不能用+=进行修改,而在列表中,+返回一个新对象,而+=则修改左边的对象。
当l2后面的对象被修改,l1引用同一个对象时,您也会注意到l1上的更改。
发布于 2012-11-11 09:35:08
分配l2 = l1之后,l2与l1相同。以下pop操作影响l1和l2,因为它们是相同的。
l2 = l2 + [item]创建一个新列表。因此,l2现在是一个不同的对象。
l2 += [item]修改l2内置。因此,l2指向与l1相同的东西。
代码执行的交互可视化:
一些相关链接:
https://stackoverflow.com/questions/13329915
复制相似问题