Какой вывод получит программа при вызове функции foo

Возникнет UnboundLocalError, числа не будут напечатаны. Присваивание a += 2 делает a локальной переменной bar, но её значение ещё не задано.

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

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

Возникнет UnboundLocalError, числа не будут напечатаны. Присваивание a += 2 делает a локальной переменной bar, но её значение ещё не задано.

Подробный разбор

Ответ с пояснениями

Условие

Дан фрагмент кода, в котором функция foo объявляет локальную переменную a и внутри неё определяет вложенную функцию bar, пытающуюся изменить эту переменную. Что будет выведено на экран после выполнения foo()?

def foo():
    a = 1
    def bar():
        a += 2
        print(a)
    bar()
foo()

Ответ

Возникнет UnboundLocalError, числа не будут напечатаны. Присваивание a += 2 делает a локальной переменной bar, но её значение ещё не задано.

Операция += включает чтение старого значения. Python заранее определяет, что a присваивается внутри bar, поэтому обращение не идёт к переменной foo автоматически.

Для изменения переменной внешней функции нужно nonlocal:

def foo():
    a = 1
    def bar():
        nonlocal a
        a += 2
        print(a)
    bar()

После исправления будет выведено 3. Объявление global здесь не подходит: оно обращалось бы к переменной модуля, а не к a в foo. Альтернативный подход — передать число аргументом и вернуть результат явно.

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

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

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

Подробнее