L1 是一个列表,L2 = L1;为什么"l2 = l2 + [item]"不影响L1,而"l2 += [item]"却影响了?

  • 本文关键字:L1 l2 item 影响 一个 L2 列表 python list
  • 更新时间 :
  • 英文 :


可能的重复:
加号等于(+=)在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后,l2l1相同。 以下pop操作会影响l1l2,因为它们是相同的。

l2 = l2 + [item]创建一个新列表。所以l2现在是一个不同的对象。

l2 += [item]修改l2就地。所以l2指向与l1相同的事情.

代码执行的交互式可视化:

  • 第一
  • 第二

一些相关链接:

  • Python 中的名称。

  • 有关列表的更多信息

最新更新