Сообщить об ошибке.

Взаимодействие с динамическими функциями

Разрешение имен свободных переменных происходит во время выполнения, а не во время компиляции.

Это означает, что следующий код напечатает 42:

i = 10
def f():
    # Здесь 'i' - свободная переменная
    print(i)

i = 42
f()
# 42

Функции eval() и exec() не имеют доступа к полной среде выполнения для разрешения имен. Имена могут быть разрешены в локальных и глобальных пространствах имен вызывающей стороны. Свободные переменные разрешаются не в ближайшем окружающем пространстве имен, а в глобальном пространстве имен. Функции eval() и exec() имеют необязательные аргументы для переопределения глобального и локального пространства имен. Если указано только одно пространство имен, оно используется для обоих.