【问题标题】:Python dict.fromkeys() generates copies of list() instead of a new one [duplicate]Python dict.fromkeys() 生成 list() 的副本而不是新的 [重复]
【发布时间】:2016-03-27 21:59:38
【问题描述】:

我想使用dict.fromkeys() 方法生成字典。我有一年list,我想给values他们分配list object。问题是dict.fromkeys() 生成列表的副本。因此,当我更新列表的元素时,它会更新所有副本。

>>> years=["1","2","3"]
>>> names=["a","b","c"]
>>> blank=[]
>>> names_in_years=dict.fromkeys(years,blank.copy())
>>> names_in_years
{'2': [], '4': [], '3': [], '1': []}
>>> names_in_years["2"].extend(names)
>>> names_in_years
{'2': ['a', 'b', 'c'], '4': ['a', 'b', 'c'], '3': ['a', 'b', 'c'], '1': ['a', 'b', 'c']}

我想单独更新dictionary 对象。结果低于我想要的:

{'2': ['a', 'b', 'c'], '4': [], '3': [], '1': []}

有没有办法在一行中做到这一点?

【问题讨论】:

  • 使用好的 ol' dict-comprehensions。
  • 这不应该被关闭。这里的问题与链接的答案完全不同。问题在于,即使发布者试图在函数调用中添加 copy,但从根本上说,相同的对象(或副本)用于所有初始实例化。如果你传入一个字典,你会得到类似的行为(所有值都是 same 字典)。

标签: python debugging dictionary


【解决方案1】:

做吧

names_in_years["2"] = names_in_years["2"] + names

而不是笨重

names_in_years["2"].extend(names)

前者将新值分配给旧值,后者将返回的值原地改变。在处理更新键值时,赋值通常比就地突变更安全、更简单。

【讨论】:

  • 前者每次都会创建一个新的列表对象,如果我们处理巨大的列表,它就没有那么有用了。正确的解决方案是为每个键分配不同的对象以防止这种突变。
  • 这是真的,但我认为 OP 的具体问题是键中的 每个 值都已更新。
  • 对,但问题在于他们如何初始化字典而不是 list.extend。所以,names_in_years = {k: [] for k in years} 会在这里解决问题。
猜你喜欢
  • 2011-07-05
  • 2011-08-16
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多