Я просматривал статью на сайте Питера Норвиг, где он пытается ответить на следующий вопрос (кстати, это не мой вопрос)
«Могу ли я сделать эквивалент (тест? Результат: альтернатива) в Python?»
вот один из перечисленных им вариантов,
def if_(test, result, alternative=None):
"If test is true, 'do' result, else alternative. 'Do' means call if callable."
if test:
if callable(result): result = result()
return result
else:
if callable(alternative): alternative = alternative()
return alternative
А вот пример использования.
>>> fact = lambda n: if_(n <= 1, 1, lambda: n * fact(n-1))
>>> fact(6)
720
Я понимаю, как это работает (я думаю), но я просто играл с кодом и решил посмотреть, что произойдет, когда я изменю третий аргумент в определении «факта» выше на
n * fact (n-1), то есть измените его на не вызываемое выражение. При запуске интерпретатор входит в бесконечный цикл. У меня есть довольно хорошее представление о том, почему это происходит, то есть функция if_ возвращает обратно то же выражение, которое получает. Но каков тип этого выражения? Что именно здесь происходит? Я не ищу подробного объяснения, но только для некоторых указателей на модель оценки python, которая могла бы помочь моему пониманию.
Спасибо!