怀疑Python的collection.defaultdict用法

时间:2017-08-16 17:56:30

标签: python python-3.x python-collections

我理解collections.defaultdict正在为这样的字典分配默认值:

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)

什么是默认值?这似乎是一个无休止的递归。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

这个概念叫做autovivication