Python l1是一个列表,l2=l1;为什么';";l2=l2+;[项目]”;影响l1,而;l2+;=[项目]”;做

Python l1是一个列表,l2=l1;为什么';";l2=l2+;[项目]”;影响l1,而;l2+;=[项目]”;做,python,list,Python,List,可能重复: 我注意到一个奇怪的问题: 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 l

可能重复:

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

    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
后,
l2
l1
相同。 以下
pop
操作影响
l1
l2
,因为它们是相同的

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

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

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

一些相关链接:


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

l2=l1+x
调用
l2=l1.\uuuu add\uuuuuuuuux)
,如果这不起作用,则调用
x.\uuuu radd\uuuuuux(l1)
。两者都应返回形成操作结果的新对象,独立于旧对象,因此不会影响
l1

l2+=x
调用
l2=l2.\uuu-iadd\uuuuuuuux
(“增广赋值”),并且仅当这不起作用时,才会返回到上文所述的
l2=l2+x

对于数字,两者都是相同的,因为它们是不可变的,因此不能用
+=
修改,而在列表中,
+
返回一个新对象,而
+=
修改左侧对象


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

这是一个什么问题?事情就是这样。注意,OP没有要求解释。他说他“注意到了一个问题”…@我是对的。因为他不明白事情是怎么回事。所以解释它们才是最重要的。@glglglglgl这是一种奇怪的方式来表达你不理解的东西。。。但是,他还是观察到了差异所在,而公认的答案并不能解释更多。另一方面,你的问题实际上提供了更多的细节。@Phantom这个问题似乎是一个结束的候选问题!所以我只是回答了这个问题,没有答案(有时我在这里找到了更好的答案来回答我自己的问题)。