首页 > 解决方案 > 为什么 defaultdict 注册没有赋值的键

问题描述

在 python 3 中,如果定义 a defaultdict,触发默认值返回一个不存在的键,那么该键将自动放入字典中??这个:

foo = defaultdict(int)
1 in foo # False
foo[1]   # 0
1 in foo # True????

这对我来说似乎是错误的。我觉得的目的defaultdict是允许用户在不将该键放入字典的情况下获得默认值。为什么语言开发人员会选择这个,我该如何避免呢?

标签: pythondefaultdict

解决方案


这与语言设计无关。你可以选择不使用collection.defaultdict

您可以通过定义__missing__方法来定义自己的字典,按照您的意愿行事:

>>> class MyDefaultDict(dict):
...     def __init__(self, default_factory):
...         self.default_factory = default_factory
...     def __missing__(self, key):
...         # called by dict.__getitem__ when key is not in the dictionary.
...         return self.default_factory()
... 
>>> 
>>> foo = MyDefaultDict(int)
>>> 1 in foo
False
>>> foo[1]
0
>>> 1 in foo
False

旁注:defaultdict使用__missing__.


推荐阅读