Программа выведет 10, затем 1. global внутри inner изменяет переменную модуля, не локальную переменную outer.
Разбор областей видимости в Python
Программа выведет 10, затем 1. global внутри inner изменяет переменную модуля, не локальную переменную outer.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Объясните, как работает следующая программа и какие значения будут выведены.
counter = 0
def outer():
counter = 10
def inner():
global counter
counter += 1
inner()
print(counter)
outer()
print(counter)
Ответ
Программа выведет 10, затем 1. global внутри inner изменяет переменную модуля, не локальную переменную outer.
outer создаёт собственную локальную переменную counter=10. Объявление global counter в inner направляет чтение и запись к переменной уровня модуля. Поэтому inner увеличивает глобальный счётчик с 0 до 1, а локальное значение 10 остаётся прежним.
10
1
Если вместо global написать nonlocal counter, изменится переменная ближайшей внешней функции: тогда вывод будет 11, затем 0. Без обоих объявлений выражение counter += 1 считалось бы присваиванием локальной переменной inner и вызвало бы UnboundLocalError при попытке прочитать её до инициализации.