-1

我了解 collections.defaultdict 正在为这样的 dict 分配默认值:

dict = collections.defaultdict(int) # default value of dict is 0

或者

dict = collections.defaultdict(lambda: 5) # default value of dict is 5

然后我在 Python 中看到了 defaultdict 的用法,如下所示:

_dict = lambda : collections.defaultdict(_dict)
dict = _dict()

dict = dict["A"]
dict = dict["B"]
dict = dict["C"]

我对第一行很困惑:

_dict = lambda: collections.defaultdict(_dict)

默认值到底是什么?这似乎是一个无限的递归。

4

1 回答 1

0

defaultdict()需要一个工厂,并且每次需要默认值时都会调用工厂。如果你传入int,每次需要一个新的默认值时,int()都会被调用。

您找到的代码使用 alambda作为工厂。每次调用它时,它都会返回一个新defaultdict(...)对象。现在,defaultdict()对象仍然需要一个工厂,在这种情况下,它只是重用了同一个工厂对象

这是可行的,因为_dict只有在调用 lambda 时才会查​​找名称,并且只有在创建 lambda 并将其分配给 name 时才能调用它_dict;依赖循环有效,因为仅在创建引用后才查找自引用。

这很像递归,但不是一回事。递归会自动调用相同的函数,直到结束条件中断调用链。但是在这里,没有自动调用链!当您需要新的默认值时,将lambda调用 并返回一个新defaultdict(_dict)对象。就是这样。没有自动链,新创建的defaultdict有自己配置的工厂,但不会自动调用。

这个概念被称为自动存活

于 2017-08-16T21:29:07.960 回答