Разбор областей видимости в Python

Программа выведет 10, затем 1. global внутри inner изменяет переменную модуля, не локальную переменную outer.

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

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

Программа выведет 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 при попытке прочитать её до инициализации.

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

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

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

Подробнее