Разрешение имен свободных переменных происходит во время выполнения, а не во время компиляции.
Это означает, что следующий код напечатает 42
:
i = 10 def f(): # Здесь 'i' - свободная переменная print(i) i = 42 f() # 42
Функции eval()
и exec()
не имеют доступа к полной среде выполнения для разрешения имен. Имена могут быть разрешены в локальных и глобальных пространствах имен вызывающей стороны. Свободные переменные разрешаются не в ближайшем окружающем пространстве имен, а в глобальном пространстве имен. Функции eval()
и exec()
имеют необязательные аргументы для переопределения глобального и локального пространства имен. Если указано только одно пространство имен, оно используется для обоих.