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这个问题似乎是一个结束的候选问题!所以我只是回答了这个问题,没有答案(有时我在这里找到了更好的答案来回答我自己的问题)。