Как функционирует оператор nonlocal в вложенных функциях

nonlocal связывает value во вложенной функции с переменной ближайшей внешней функции. Здесь такое имя существует, поэтому объявление корректно; вызов func4 внутри func3 напечатает 1.

Короткий ответ

Что ответить на собеседовании

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 при определении кода.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее