Использование нелокального внутри exec

#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 инструкцию.