【问题标题】:Losing updates to lists, made in for loop, outside of the loop丢失对列表的更新,在 for 循环中,在循环外
【发布时间】:2020-07-06 19:09:56
【问题描述】:

我使用的是 python 3.7,我需要使用相同的操作集修改多个列表 - 去重和排序。

我编写了以下代码,并且可以验证列表是否已更新(使用 for 循环中的打印语句),但更新在循环之外丢失(最后一个打印语句)。

这是我的代码:

for lst in list1, list2, list3, list4, list5:
    print(len(lst))  # shows the original count before dedup
    lst = list(set(lst))
    lst.sort()
    print(len(lst))  # shows the right count after dedup

print(list1) # shows the original list before dedup

我猜 for 循环会更新列表的副本,而不是原始列表。我可以在没有 for 循环的情况下对单个列表运行 set 和 sort,但检查是否有更简洁的方法来使用循环更新数十个列表。

【问题讨论】:

  • 在循环中修改原始数组总是一个坏主意。地图 fns 可能是一个不错的选择。
  • 请提供minimal reproducible example,以及当前和预期的输出。
  • 很好的工作创造了一个深思熟虑的问题。一段时间后您会习惯于命名绑定规则,但对于初学者来说会感到困惑。很好地发布了一个 MCVE,它不仅说明了问题,而且表明您已经做出了真正的尝试来跟踪问题并自行调试。欢迎来到 SO!
  • 顺便说一句,如果你有几十个列表,可以考虑将它们保存在一个列表或字典中。

标签: python python-3.x list for-loop


【解决方案1】:

lst = 重新绑定名称 lst,因此它不再引用同一个对象。为避免重新绑定,您可以覆盖列表的内容:

lst[:] = set(lst)

【讨论】:

  • 虽然就地操作避免了第三次复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2016-05-31
  • 2019-01-17
相关资源
最近更新 更多