3

可能重复:
加号等于(+=)在 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']
4

2 回答 2

6

+并且+=是不同的运算符,具有不同的内部含义,如此处所述

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-11T09:43:58.413 回答
1

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

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

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

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

一些相关链接:

于 2012-11-11T09:35:08.267 回答