Рассмотрим следующий фрагмент:
def bar():
return 1
print([bar() for _ in range(5)])
Он дает ожидаемый результат [1, 1, 1, 1, 1]
.
Однако, если я попытаюсь выполнить exec
тот же фрагмент в пустой среде (locals
и globals
оба установлены на {}
), он дает NameError
:
if 'bar' in globals() or 'bar' in locals():
del bar
# make sure we reset settings
exec("""
def bar():
return 1
print([bar() for _ in range(5)])
""", {}, {})
NameError: name 'bar' is not defined
Если я вызываю exec
как exec(…, {})
или exec(…)
, он выполняется как ожидалось.
Почему?
EDIT:
Рассмотрим также следующий фрагмент:
def foo():
def bar():
return 1
print('bar' in globals()) # False
print('bar' in locals()) # True
print(['bar' in locals() for _ in [1]]) # [False]
print([bar() for _ in [1, 2]]) # [1, 1]
Как и в моем первом exec, у нас нет бара у локальных жителей внутри понимания списка. Однако, если мы попытаемся вызвать его, он работает!