#python #python-3.x #cpython #python-exec #python-nonlocal
#python #python-3.x #cpython #python-exec #python-нелокальный
Вопрос:
Почему следующий код:
exec("""
a = 3
def b():
nonlocal a
a = a 1
b() #error occurs even without this call
print(a)
"""
)
)
выдает эту ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 4
SyntaxError: no binding for nonlocal 'a' found
Это еще немного текста, чтобы удовлетворить соотношению текст / код.
Комментарии:
1.
a
не входит в область действия функции, вы бы хотелиglobal a
вместо этого2. Вы получите ту же ошибку с тем же кодом, написанным явно, вместо использования
exec
в строке.
Ответ №1:
nonlocal
Инструкция ищет переменную, которую вы называете, во включающем пространстве имен функций (и выдает ошибку, если ни в одном таком пространстве имен такой переменной нет). Если нет заключающей функции, вы не хотите nonlocal
. Если вам нужна переменная на верхнем уровне, вместо этого вы хотите использовать global
инструкцию.