Рекурсивные определения в 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, По этой причине рекурсивные функции могут работать вообще.

Другие вопросы по тегам