【问题标题】:If dict().fromkeys() all point to the same object, what purpose does the default value argument serve?如果 dict().fromkeys() 都指向同一个对象,那么默认值参数的作用是什么?
【发布时间】:2020-06-02 13:18:12
【问题描述】:

dict 方法{}.fromkeys() 接受一个可迭代的字符串,它将被转换为字典键。默认值将默认为None。例如:

d = {}.fromkeys(['loss', 'val_loss'])
{'loss': None, 'val_loss': None}

可选的第二个参数是所有这些值将采用的默认值:

d = {}.fromkeys(['loss', 'val_loss'], [])
{'loss': [], 'val_loss': []}

我知道您可以像这样初始化一个空字典。更复杂的是默认值指向同一个对象

[id(val) for val in d.values()]
[140711273848032, 140711273848032]

如果你要附加一个列表,它会附加这个字典的所有值。因此,您需要将值重新分配给新对象,以便将 dict 值视为单独的对象:

d['loss'] = list([0.2, 0.4])

如果您不这样做,您将同时更改所有 dict 值。

我的问题:可选默认值的目的是什么?

如我所见,无论如何你都需要重新分配这个默认值,除非你想用不同的字典键操作同一个对象。我想不出一个诚实的理由来为一个对象拥有多个 dict 键。

【问题讨论】:

  • 如您所见,可选默认值的目的是成为默认值,而不是 None。仅当它是可变对象(如列表或字典)时,每个键都是同一个对象才有问题。如果您在查找不存在的键时希望使用列表或字典作为默认值的字典,则应使用 defaultdict 代替。
  • 这能回答你的问题吗? dict.fromkeys all point to same list
  • 我知道如何使用defaultdict,这不是我想要的。
  • 来自documentation "fromkeys() 是一个返回新字典的类方法。值默认为 None。所有的值都只引用一个实例,所以它通常不会将值理解为可变对象,例如空列表。要获得不同的值,请改用 dict 推导式。"

标签: python dictionary


【解决方案1】:

这可以工作(字典理解)

keys = {'A', 'B', 'C'}
int_lst = [9]
a_dict = { key : list(int_lst) for key in keys }
print(a_dict)
a_dict['B'].append(12)
print(a_dict)

【讨论】:

  • 感谢您的回答,但我的问题不是“还有什么办法”,我知道如何使用字典理解。
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
相关资源
最近更新 更多