我理解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)
什么是默认值?这似乎是一个无休止的递归。
答案 0 :(得分:0)
defaultdict()
需要工厂,并且每次需要默认值时调用工厂。如果您传入int
,则每次需要新的默认值时,都会调用int()
。
您找到的代码使用lambda
作为工厂。每次调用它时,它都会返回一个新的defaultdict(...)
对象。现在,defaultdict()
对象仍然需要工厂,在这种情况下,它只是重用相同的工厂对象。
这是有效的,因为只有在调用lambda时才会查找名称_dict
,并且只有在创建lambda并将其分配给名称_dict
时才能调用它。依赖循环是有效的,因为只有在创建引用后才会查找自引用。
这很像递归,但不一样。递归自动调用相同的函数,直到结束条件中断调用链。但在这里,没有自动呼叫链!当您需要新的默认值时,将调用lambda
,并返回一个新的defaultdict(_dict)
对象。 那就是。没有自动链,新建的defaultdict
有一个自己配置的工厂,但它不会自动调用。
这个概念叫做autovivication。