我刚刚遇到在Python中实现the following way的AutoVivification:
from collections import defaultdict
Tree = lambda: defaultdict(Tree)
# common name by class, order, genus, and type-species
common_name = Tree()
common_name['Mammalia']['Primates']['Homo']['H. sapiens'] = 'human being'
以下构造如何运作?
Tree = lambda: defaultdict(Tree)
Tree
似乎没有在lambda函数的主体之前定义,并且它不作为参数传递。
lambda函数的主体在定义之前如何知道Tree
?该语言支持哪些其他类型的递归定义?
答案 0 :(得分:4)
这就是像python这样的动态语言的优点 - Tree
是在你调用它时定义的。它与任何其他递归函数没有什么不同......
e.g。你可能不会盯着看这个:
def recurse(i):
if i > 0:
recurse(i-1)
这是有效的,因为python创建了递归函数。然后当你调用它时,python会在它到达那一行时查找递归函数并调用它...
在这种情况下,它真的没什么不同 - 你的lambda可以这样编写(也许更清楚):
def Tree():
return defaultdict(Tree)
答案 1 :(得分:2)
相当于:
def Tree():
return defaultdict(Tree)
只有在调用函数时才会立即评估函数的内容,此时 可以知道 关于Tree
。这就是递归函数可以工作的原因。