python - 为什么所有列表元素中的值都重复?

标签 python python-3.x

我有一个具有以下结构的列表:

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/

相关文章:

python - Django Tastypie - 使用 URL 参数过滤 ToManyField 资源

python - 不同大小集合中元素的所有可能组合

带有 Django : ImportError: No module named 'openid.association' 的 python-social-auth

python - 如何使用 Django ORM 通过 DateTimeField() 计算 Postgresql 数据库中的项目

python - 加快从巨大的 csv 文件中删除停用词

python - 检查是否不在列表中 - Python 中的更多条件

python - Celery .delay() 同步工作,不延迟

python - Matplotlib slider 和图表下的阴影

python - requests.get 大文件,下载不完整但找不到错误指示

python3 输入 : extract argument list from Callable