defaultdict `.get` 在 `[]` 运算符之后调用后返回项目,而不是返回任何内容

问题描述 投票:0回答:1

我运行了这段代码:

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")
时,它返回计算值?这是一个预期值,还是一个错误?

python defaultdict
1个回答
0
投票

您误解了 API,这里明确解决了这个问题文档

如果

default_factory
不是
None
,则不带参数调用它,为给定键提供默认值,this 值被插入到键的字典中,并返回。

添加了强调。因此,每当您使用

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}
© www.soinside.com 2019 - 2024. All rights reserved.