Python中的递归定义

时间:2015-01-22 00:58:05

标签: python lambda autovivification

我刚刚遇到在Python中实现the following wayAutoVivification

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?该语言支持哪些其他类型的递归定义?

2 个答案:

答案 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。这就是递归函数可以工作的原因。