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)