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

l1 is a list, l2 = l1; why doesn't “l2 = l2 + [item]” affect l1 while “l2 += [item]” does?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does plus equals (+=) do in Python?

我注意到一个奇怪的问题:

1
2
3
4
5
6
7
8
9
10
11
    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

输出是:

1
2
3
['2', '3']
['2', '3', '1']
['2', '3']

但如果我把l2 = l2 + [item]改为l2 += [item]的话,输出将是:

1
2
3
['2', '3']
['2', '3', '1']
['2', '3', '1']


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

l2 = l1 + xl2 = 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命名。

  • 更多关于列表