Область видимости локальных переменных
Содержание курса
В прошлом уроке мы разбирались с параметрами по умолчанию и возвратом нескольких значений через кортеж. Там функции уже активно принимали данные и что-то возвращали — но мы ни разу не задались вопросом: а что происходит с переменными, которые живут внутри функции? Куда они деваются после вызова и можно ли до них добраться снаружи? Этот урок отвечает именно на этот вопрос.
Локальная переменная и область видимости
Когда Python выполняет тело функции, он создаёт для неё отдельное пространство имён — изолированную область, в которой живут все переменные, объявленные внутри. Это и есть локальная область видимости (local scope).
Любая переменная, которой вы присваиваете значение внутри функции, называется локальной переменной. Она существует ровно столько, сколько выполняется функция: появляется в момент первого присваивания и исчезает, как только функция завершает работу.
Посмотрим на простой пример:
def greet():
message = "Привет!"
print(message) # работает — мы внутри функции
greet()
Внутри greet переменная message существует и доступна. Но снаружи функции её нет — она никогда не попадала в глобальное пространство имён.
Глобальное пространство имён — это «верхний уровень» программы, где живут переменные, объявленные вне любых функций. Python при поиске имени сначала смотрит в локальную область текущей функции, и только если там не нашёл — поднимается выше, в глобальную. Но обратного пути нет: глобальный код не заглядывает внутрь функции.
Можно представить это как рабочий стол в закрытой комнате. Всё, что вы кладёте на стол во время работы в этой комнате, доступно только пока вы там находитесь. Когда вы выходите и дверь закрывается — стол исчезает вместе со всем, что на нём лежало.
Важный момент: параметры функции — это тоже локальные переменные. Когда вы пишете def add(a, b), имена a и b живут только внутри add и недоступны за её пределами.
def add(a, b):
total = a + b
# и 'a', и 'b', и 'total' — все локальные
add(3, 5)
# здесь нет ни a, ни b, ни total
Эта изоляция — не ограничение, а защита. Благодаря ней функции не мешают друг другу: две разные функции могут использовать переменную с одним именем, например result, и они никак не пересекутся. Каждая работает со своей копией в своём пространстве.
