Рекурсивные определения в Python
Я просто наткнулся на следующий способ реализации AutoVivification в Python:
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
кажется, не определен перед телом лямбда-функции и не передается в качестве аргумента.
Как тело лямбда-функции узнает о Tree
прежде чем это определено? Какие другие типы рекурсивных определений поддерживаются языком?
2 ответа
Это замечательная вещь в динамическом языке, таком как Python - Tree
определяется временем, когда вы называете это. Это ничем не отличается от любой другой рекурсивной функции на самом деле...
например, вы, вероятно, не бросили бы глаз, чтобы увидеть это:
def recurse(i):
if i > 0:
recurse(i-1)
Это работает, потому что python создает функцию recurse. Затем, когда вы вызываете его, python ищет функцию recurse, когда попадает в эту строку, вызывает ее и...
В этом случае, это действительно не сильно отличается - ваша лямбда может быть написана (возможно, более четко), как это:
def Tree():
return defaultdict(Tree)
Это эквивалент:
def Tree():
return defaultdict(Tree)
Содержимое функции не оценивается сразу, только когда она вызывается, когда она может узнать Tree
, По этой причине рекурсивные функции могут работать вообще.