Возникнет UnboundLocalError, числа не будут напечатаны. Присваивание a += 2 делает a локальной переменной bar, но её значение ещё не задано.
Какой вывод получит программа при вызове функции foo
Возникнет 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. Альтернативный подход — передать число аргументом и вернуть результат явно.