Короткий ответ
Присваивание внутри функции делает переменную локальной: она видна только в этой функции. Если переменную лишь читают, она считается глобальной, и интерпретатор ищет её на уровне модуля. Чтобы изменить глобальную переменную из функции, нужно ключевое слово global.
Как это работает подробнее
Правило простое: присваивание в теле функции создаёт локальную переменную, а чтение без присваивания — обращение к переменной из внешней области видимости.
- Локальная область. Переменные, объявленные внутри функции, существуют только во время её вызова и исчезают после завершения.
- Глобальная область. Переменные уровня модуля доступны из любого места программы, в том числе из функций при чтении.
- Одинаковые имена. Присваивание внутри функции создаёт новую локальную переменную с тем же именем, а не меняет глобальную.
- Ключевое слово global. Оно сообщает интерпретатору, что имя относится к уровню модуля, и тогда переменную можно изменять из функции.
Пример кода
Локальная и глобальная переменные
x = 10 # глобальная переменная
def func():
y = 5 # локальная переменная, видна только внутри func
print(x) # x здесь читается, поэтому ищется в глобальной области
def change():
x = 20 # это не изменение глобальной x,
# а создание новой локальной переменной с тем же именемЧто использовать на практике
- Передача данных. Передавай значения в функцию через аргументы и возвращай результат, а не через глобальные переменные.
- Общая конфигурация. Когда данные нужны во многих модулях, используй отдельный модуль-конфиг, который импортируется в нужных местах.
- Точечный global. Применяй
globalтолько когда действительно нужно изменить глобальную переменную из функции.
Подводные камни
- Тень глобальной. Присваивание глобальной переменной внутри функции без
globalсоздаёт локальную переменную, а не меняет глобальную. - Злоупотребление. Обилие глобальных переменных делает код менее предсказуемым и усложняет тестирование.
- Скрытая локальность. Если переменной в функции хоть раз присваивается значение, она локальна для всей функции, даже если до этого читалась.
Как отвечать на собеседовании
- Начни с главного правила: присваивание внутри функции — локальная переменная, чтение — глобальная → приведи пример, где присваивание создаёт локальную переменную с тем же именем → объясни роль
global→ заверши рекомендацией передавать данные через аргументы.