l1是一个列表,l2 = l1;为什么不“l2 = l2 + [item]”影响l1而“l2 + = [item]”呢?

时间:2012-11-11 09:25:35

标签: python list

  

可能重复:
  What does plus equals (+=) do in 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']

2 个答案:

答案 0 :(得分:5)

++=是不同的运算符,具有不同的内部含义,如here所述。

l2 = l1 + x来电l2 = l1.__add__(x),如果不能,则调用x.__radd__(l1)。两者都应该返回一个形成操作结果的新对象,与旧的对象无关,因此不会影响l1

l2 += x来电l2 = l2.__iadd__(x)(&#34;扩充作业&#34;),并且只有在不起作用的情况下,如上所述回退到l2 = l2 + x。< / p>

对于数字,两者都是相同的,因为它们是不可变的,因此无法使用+=进行修改,而在列表中,+会返回一个新对象,而+=会修改左手一方。

由于修改了l2后面的对象并且l1引用了同一个对象,因此您也注意到l1上的更改。

答案 1 :(得分:1)

分配l2 = l1后,l2l1相同。 以下pop操作会影响l1l2,因为它们是相同的。

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

l2 += [item]修改l2到位。因此l2指向与l1相同的内容。

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

一些相关链接: