python - 在 python 中执行列表扩充赋值 (+=) 的动机是什么?

标签 python

<分区>

>>> list1 = []
>>> list2 = list1
>>> list2 += [1]
>>> print list1
[1]

比较

>>> list1 = []
>>> list2 = list1
>>> list2 = list2 + [1]
>>> print list1
[]

“+=”操作修改原始列表是否有原因?

编辑:只是为了让我的问题更清楚一些

在我所知道的大多数语言中,'+='-operator 不是这样工作的,我想知道为什么它在 python 中以这种方式设计。

一些例子:

ruby

irb(main):001:0> l = []
irb(main):002:0> a = l
irb(main):003:0> a += [2]
irb(main):004:0> l
=> []

Scala 等..

最佳答案

reference 存储的 Python 列表。

这意味着当您执行 list2 = list1 时,您并不是在复制列表 - 您只是在说“list2 指的是同一件事 list1 做”,即您在执行 list1 = [] 时最初创建的列表。

Python 指定 += 表示列表的“就地追加”,因为大多数时候当您在列表上使用 += 时,这就是您想要的要做 - 您通常不希望每次添加元素时都创建新列表。

因此,当您追加到 list2,它“指的是 list1 所指的同一对象”,然后从 list1 读取时,您看到附加的项目,正如预期的那样,因为它们都指向同一个列表。

但是,使用 + 时,总是会创建一个新列表,因为修改其中任何一个操作数都没有意义(因为 a+b 没有t 意味着修改 ab

因此,当您执行 list2 = list2 + [1] 时,您创建了一个新列表,其中包含 list2 指向的原始对象的所有内容,并且还有 1,然后说 list2 现在引用那个新列表。由于它现在引用的列表与 list1 不同,因此当您从 list1 读取时,您仍然会看到没有额外 1 的原始列表。

关于python - 在 python 中执行列表扩充赋值 (+=) 的动机是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5242933/

相关文章:

python - 如何修复 "ImportError: cannot import name ' setup' 形式 'cx_Freeze' "

python - 按列值是否等于 Spark 中的列表进行过滤

python - 如何在Windows中使用Python播放Mp3文件?

python - 如何生成许多列表并为其赋值

python - Python中的散点图和颜色映射

python - 生成代码以与不需要重新编译的正在运行的 cpp 应用程序交互的好方法是什么?

python - Flask-sentinel/oauth/token 端点 CORS 问题

python - 使用 *args 和指定的列表索引对列表求和

python - 全局名称 'doc' 未定义,从一个函数到另一个函数的 vcall 出现问题

Python 秒表示例 - 同时启动所有类实例?