python - 为什么 foo.append(bar) 会影响列表列表中的所有元素?

标签 python list append

我创建了一个列表列表并想将项目 append 到各个列表,但是当我尝试 append 到其中一个列表 (a[0].append(2)) 时,项目被添加到所有列表中。

a = []
b = [1]

a.append(b)
a.append(b)

a[0].append(2)
a[1].append(3)
print(a)

给出:[[1, 2, 3], [1, 2, 3]]

而我希望:[[1, 2], [1, 3]]

改变我构造初始列表列表的方式,使 b 成为 float 而不是列表,并将括号放在 .append() 中,给出了我想要的输出:

a = []
b = 1

a.append([b])
a.append([b])

a[0].append(2)
a[1].append(3)
print(a)

给出:[[1, 2], [1, 3]]

但是为什么?结果应该不同是不直观的。我知道这与 multiple references to the same list 有关,但我看不出发生了什么。

最佳答案

这是因为列表包含对对象的引用。您的列表不包含 [[1 2 3] [1 2 3]] , 它是 [<reference to b> <reference to b>] .

当您更改对象(通过向 b append 内容)时,您更改的是对象本身,而不是包含该对象的列表。

为了得到你想要的效果,你的 list a必须包含 b 的副本而不是对 b 的引用.至copy a list你可以使用范围 [:] .例如:

>>> a = []
>>> b = [1]
>>> a.append(b[:])
>>> a.append(b[:])
>>> a[0].append(2)
>>> a[1].append(3)
>>> print a
[[1, 2], [1, 3]]

关于python - 为什么 foo.append(bar) 会影响列表列表中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360286/

相关文章:

python - 从用户输入中获取矩阵并将其定义为列表列表时遇到问题

python - Kivy:在重新进入屏幕时将切换按钮重置为 "normal"

python - 遍历二维列表,将列表中一行的每个值分配给一个变量,对每一行重复 - python

python - 获取 3d 列表中唯一元素的最低索引的高效算法

performance - Haskell:涉及大型列表的计算中出现意外的时间复杂性

java - 在java中的变量名末尾 append 一个数字

jQuery 追加重复内容

javascript - 如何将每个带有 class 的 ul append 到其上方最接近的文章标签?

python - 使用 Python 多处理进行通信时 OSX 和 Linux 之间的性能差异

python - Protobuf,在python3.6中编译后导入报错