【发布时间】: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