nonlocal связывает value во вложенной функции с переменной ближайшей внешней функции. Здесь такое имя существует, поэтому объявление корректно; вызов func4 внутри func3 напечатает 1.
Как функционирует оператор nonlocal в вложенных функциях
nonlocal связывает value во вложенной функции с переменной ближайшей внешней функции. Здесь такое имя существует, поэтому объявление корректно; вызов func4 внутри func3 напечатает 1.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разберите, как работает ключевое слово nonlocal в следующем примере, и выясните, возникнет ли ошибка при попытке вызвать func4().
def func3():
value = 1
def func4():
nonlocal value
print(value)
Ответ
nonlocal связывает value во вложенной функции с переменной ближайшей внешней функции. Здесь такое имя существует, поэтому объявление корректно; вызов func4 внутри func3 напечатает 1.
В показанном коде func4 лишь определяется: func3 её не вызывает и не возвращает. Вызов func3() поэтому ничего не печатает, а прямой func4() снаружи даст NameError.
Чтобы получить замыкание:
def func3():
value = 1
def func4():
nonlocal value
print(value)
return func4
func3()() # 1
Для простого чтения nonlocal не требуется; он нужен при присваивании внешней локальной переменной. Если подходящего внешнего имени вообще нет, возникает SyntaxError при определении кода.