我有一个具有以下结构的列表:
l = [[[],0]] * 5
列表中的每个节点都包含另一个列表:
- 内部列表中的第一个元素包含另一个列表
- 内部列表中的第二个元素包含 wight
我正在尝试为内部列表添加值:
index = 0
l[index][0].append('s')
但它添加了值 's'
到所有列表 ( l
) 值:
l = [[['s'],0], [['s'],0], [['s'],0], [['s'],0], [['s'],0]]
- 为什么值“s”会重复到所有列表元素?
- 如何将值“s”仅添加到第一个内部列表
(即
l = [[['s'],0], [[],0], [[],0], [[],0], [[],0]]
)
Python 3.6.8
最佳答案
问题出在语句的 * 5
部分,因为它生成同一列表对象的 5 个别名,而不是 5 个不同的列表实例。您可以想象您的语句等效地写成如下:
a = [[],0]
l = [a,a,a,a,a]
这遵循语句的求值顺序,并且更明显地表明列表 l
实际上是 5 个别名的列表。
用推导式替换 l
的定义可以修复该问题:
l = [[[],0] for _ in range(5)]
在推导式中,range
上的循环确保在每个位置创建一个新实例(例如,检查l[0]不是l[1]
),以便追加可以按您期望的方式工作:
l[0][0].append(1)
print(l)
打印
[[[1], 0], [[], 0], [[], 0], [[], 0], [[], 0]]
关于python - 为什么所有列表元素中的值都重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63593070/