2012-11-11 51 views
2

可能重复:
What does plus equals (+=) do in Python?l1是一个列表,l2 = l1;为什么“l2 = l2 + [item]”会影响l1而“l2 + = [item]”呢?

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

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

回答

5

++=是不同运营商的不同woth内部含义描述here

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

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

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

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

一些相关链接:

+0

请注意,OP没有要求解释。他说他“注意到了一个问题”...... – phant0m

+0

@ phant0m对。因为他不明白事情是如何运作的。所以解释他们是要做的事情。 – glglgl

+1

@glglgl这是一种奇怪的方式让你不理解某些东西......但是,他确实观察到了差异,接受的答案也不能解释这一点。另一方面,你的实际提供了更多的细节。 – phant0m

相关问题