Python: доступ из лямбды к имени, которое находится в области видимости, но не в пространстве имен

Рассмотрим следующий код:

aDict = {}    
execfile('file.py',globals(),aDict)
aDict['func2']() # this calls func2 which in turn calls func1. But it fails

И file.py содержит это:

def func1():
    return 1

myVar = func1() # checking that func1 exists in the scope

func2 = lambda: func1()

Это дает сообщение об ошибке "NameError: глобальное имя" func1 "не определено".

Я не уверен, что здесь происходит.
Код в file.py выполняется с пустым локальным пространством имен.
Затем внутри этого кода определяется новая функция, которая сразу же вызывается. Это означает, что функция существует в этой области.

Итак... почему func1 нельзя назвать внутри лямбды?

На других языках лямбды / замыкания связаны с областью, в которой они определены.
Как правила в Python? Они связаны с областью? в пространство имен?

1 ответ

Я думаю, что пространство имен, в котором определен func1 (пространство имен file.py), пропало, поэтому оно не может найти его снова. Вот код, в котором запоминается func1, хотя он и ужасен:

func2 = (lambda x: lambda : x())(func1)
Другие вопросы по тегам