首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >l1是一个列表,l2 = l1;为什么"l2 = l2 + [item]“不影响l1,而"l2 += [item]”影响l1?

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

Stack Overflow用户
提问于 2012-11-11 09:25:35
回答 2查看 2K关注 0票数 3

可能重复: 加法等于(+=)在Python中做什么?

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

代码语言:javascript
复制
    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

产出如下:

代码语言:javascript
复制
['2', '3']
['2', '3', '1']
['2', '3']

但是,如果我将l2 = l2 + [item]转换为l2 += [item],输出将是:

代码语言:javascript
复制
['2', '3']
['2', '3', '1']
['2', '3', '1']
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-11 09:43:58

++=是不同的运算符,有着不同的内部含义,如这里所描述的。

l2 = l1 + x调用l2 = l1.__add__(x),如果不起作用,则调用x.__radd__(l1)。两者都应该返回一个新对象,该对象与旧对象无关,因此不会影响l1

l2 += x调用l2 = l2.__iadd__(x) (“增广赋值”),只有当这种分配不起作用时,才会回到上面描述的l2 = l2 + x

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

l2后面的对象被修改,l1引用同一个对象时,您也会注意到l1上的更改。

票数 6
EN

Stack Overflow用户

发布于 2012-11-11 09:35:08

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

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

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

代码执行的交互可视化:

  • 第一
  • 第二

一些相关链接:

  • Python中的名称
  • 名单上更多内容
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13329915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档