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

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']

2
这是什么问题?这只是事实而已。 - phant0m
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上的更改。

1

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

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

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

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

一些相关链接:


请注意,OP并没有要求解释。他说他“注意到了一个问题”... - phant0m
@phant0m 没错。因为他不理解事情的运作方式。所以解释是必须要做的事情。 - glglgl
1
@glglgl 那是一种奇怪的表达方式,表示你不理解... 但是他确实观察到了区别,而被接受的答案并没有解释更多的内容。相反,你的回答提供了更多的细节。 - phant0m
1
@phant0m 这个问题似乎是一个关闭的候选人!所以我回答了这个问题,以免它没有答案(有时我在这里关闭的问题中找到更好的解决方案来解决自己的问题) - ovgolovin
如果我意识不到我没有正确理解某些事情,我可能会认为一些本不是问题的事情是问题... - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接