我运行了这段代码:
from collections import defaultdict
my_dict = defaultdict(lambda: 6, a=7)
print(repr(my_dict.get("a")))
print(repr(my_dict.get("b")))
print(repr(my_dict["b"]))
print(repr(my_dict.get("b")))
输出是:
7
None
6
6
运行它:
3.13.1 (tags/v3.13.1:0671451, Dec 3 2024, 19:06:28) [MSC v.1942 64 bit (AMD64)]
。
如你所见,当我在调用
my_dict.get("b")
之前调用my_dict["b"]
时,它返回了None
。但我打电话给my_dict.get("b")
后,它就回来了None
。
根据docs,它应该仅在
my_dict["b"]
调用(__getitem__()
方法)时返回工厂计算的默认值,那么为什么在第二次调用:my_dict.get("b")
时,它返回计算值?这是一个预期值,还是一个错误?
您误解了 API,这里明确解决了这个问题文档:
如果
不是default_factory
,则不带参数调用它,为给定键提供默认值,this 值被插入到键的字典中,并返回。None
添加了强调。因此,每当您使用
mydict[x]
并使用默认工厂时,它都会在内部 set 为该值。因此,如果您使用 .get
,它只是检索已设置的值。这就是它应该如何工作。
另一种思考方式是它的工作原理如下
dict.setdefault
:
>>> mydict = {'a':1}
>>> mydict.setdefault('a', 42)
1
>>> mydict
{'a': 1}
>>> mydict.setdefault('b', 42)
42
>>> mydict
{'a': 1, 'b': 42}