【问题标题】:Automatically generated list not behaving properly自动生成的列表行为不正常
【发布时间】:2019-03-25 01:42:54
【问题描述】:

我找到了一种制作here 的循环列表的好方法。并且代码按照我的需要运行。

x=["alpha","betta", "gamma"]
y=[[] for _ in range(len(x))]
y[1]=3

按预期给我[[], 3, []]。但是当我尝试升级代码时:

z=[10,20,30]
x=["alpha","betta"]
y=[[] for _ in range(len(z))]
y=[y for _ in range(len(x))]
y[1][1]=4

会给我正确的形状,但我会得到[[[], 4, []], [[], 4, []]]

我显然陷入了链接中提到的陷阱,而不是[[[], [], []], [[], 4, []]],但我不明白为什么以及如何避免这个问题

【问题讨论】:

  • 拼写为“beta”;)
  • 现在我不确定它是否真的是重复的,因为 OP 正确地创建了第一个 2D 事物。错误只是一遍又一遍地传递相同的引用。重新打开,因为 OP 不明白为什么,即使做了一些研究

标签: python list loops


【解决方案1】:

this solution 解决了您正在演示的问题,但如果您这样做会怎样:

y=[[] for _ in range(len(z))]
y=[y.copy() for _ in range(len(x))]
y[1][1].append(12)

这里我使用列表引用而不是覆盖它,所以我得到:

[[[], [12], []], [[], [12], []]]

该死的。为什么这个?因为copy创建了一个浅层副本,你需要deepcopy

import copy
y=[copy.deepcopy(y) for _ in range(len(x))]
y[1][1].append(12)

打印:

[[[], [], []], [[], [12], []]]

现在选择最适合您的需求。

【讨论】:

    【解决方案2】:

    这是您的代码出错的地方:

    y=[y for _ in range(len(x))]
    

    因为您实际上是在创建两个指向同一个列表(即 y)的指针。相反,您可以尝试这样的事情:

    y=[y.copy() for _ in range(len(x))]
    

    这解决了您创建新列表后的问题。

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多