📌 Введение
Понимание области видимости (scope) переменных — фундаментальное знание для любого Python-разработчика. Ошибки, связанные с глобальными и локальными переменными, нередко становятся источником багов, особенно у начинающих.
В этой статье мы детально разберём:
-
Разницу между локальными и глобальными переменными;
-
Что делает ключевое слово
global
; -
Что такое приватные переменные и можно ли их делать в Python;
-
Ошибки, связанные с областью видимости;
-
Практические советы и примеры из реальных проектов.
🔍 Что такое переменная?
Переменная — это имя, которое ссылается на объект в памяти. В Python переменные не имеют типов — тип имеет объект, на который ссылается переменная.
📦 Локальные переменные
Определение:
Локальная переменная — это переменная, определённая внутри функции. Она доступна только в этой функции.
📌 name
существует только в пределах функции say_hello
.
🌐 Глобальные переменные
Определение:
Глобальная переменная — это переменная, объявленная вне всех функций. Она доступна в любом месте файла (если не перекрыта локальной).
⚠️ Что если попытаться изменить глобальную переменную внутри функции?
📛 Возникает UnboundLocalError
, потому что Python считает counter
локальной переменной (из-за +=
), но она не определена.
🔑 Ключевое слово global
Чтобы изменить глобальную переменную внутри функции, используйте ключевое слово global
.
🔁 Использование глобальных переменных в циклах и логике
Такой подход работает, но часто считается плохой практикой, особенно в больших проектах.
🧭 Область видимости в Python: LEGB Rule
Python ищет переменные по правилу LEGB:
-
L — Local (внутри функции);
-
E — Enclosing (вложенные функции);
-
G — Global (модуль);
-
B — Built-in (встроенные имена, как
print
,len
).
Пример:
🧩 Нюанс: nonlocal
Ключевое слово nonlocal
используется для доступа к переменным из внешней, но не глобальной области видимости (во вложенных функциях):
🛡️ Приватные переменные в Python
Python не поддерживает настоящую приватность, но по соглашению:
-
_var
— "приватная переменная" (для внутреннего использования); -
__var
— "защищённая" (name mangling); -
__var__
— магическая переменная (не трогать).
Пример:
📊 Сравнение локальных и глобальных переменных
Параметр | Локальная | Глобальная |
---|---|---|
Область действия | Только внутри функции | Во всём модуле |
Перезапись в функции | Да | Только с global |
Риск побочных эффектов | Минимальный | Высокий |
Рекомендуемость | Рекомендуется | Избегать при возможности |
🧠 Когда использовать глобальные переменные?
✅ Подходящие случаи:
-
Константы (
PI = 3.14
); -
Настройки по умолчанию;
-
Глобальные флаги (
DEBUG = True
); -
Кэширование, если нет других способов.
❌ Не стоит:
-
Изменять глобальное состояние из разных функций;
-
Использовать глобальные переменные для обмена данными между функциями — это делает код хрупким и нечитаемым.
🧪 Кейсы из практики
Кейс 1: Счётчик вызовов функции
❌ Плохо:
✅ Лучше:
✅ Рекомендации
-
Используйте локальные переменные по умолчанию.
-
Избегайте глобальных переменных для состояния.
-
Объявляйте глобальные константы ЗАГЛАВНЫМИ буквами.
-
Приватность обеспечивайте по соглашению:
_var
или__var
.
❓FAQ
Как объявить глобальную переменную в Python?
Вне всех функций. Для изменения внутри функции — используйте global
.
Что такое nonlocal
?
Позволяет изменять переменные из внешней (но не глобальной) функции.
Есть ли настоящие приватные переменные?
Нет. Приватность в Python — договорённость, а не механизм безопасности.
Можно ли использовать глобальные переменные?
Можно, но осознанно и только для констант или конфигурации.
🔚 Заключение
Локальные и глобальные переменные — основа работы с памятью и логикой в Python. Локальные переменные — безопасный и изолированный способ работы. Глобальные переменные — мощный, но рискованный инструмент.
📌 Главное:
-
Локальные переменные — по умолчанию;
-
Глобальные — только при необходимости;
-
Приватность в Python реализуется по соглашению, а не механике.