Локальные и глобальные переменные в Python: как их использовать правильно

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

📌 Введение

Понимание области видимости (scope) переменных — фундаментальное знание для любого Python-разработчика. Ошибки, связанные с глобальными и локальными переменными, нередко становятся источником багов, особенно у начинающих.

В этой статье мы детально разберём:

  • Разницу между локальными и глобальными переменными;

  • Что делает ключевое слово global;

  • Что такое приватные переменные и можно ли их делать в Python;

  • Ошибки, связанные с областью видимости;

  • Практические советы и примеры из реальных проектов.


🔍 Что такое переменная?

Переменная — это имя, которое ссылается на объект в памяти. В Python переменные не имеют типов — тип имеет объект, на который ссылается переменная.

python
x = 42 x = "теперь строка"

📦 Локальные переменные

Определение:

Локальная переменная — это переменная, определённая внутри функции. Она доступна только в этой функции.

python
def say_hello(): name = "Python" print("Привет,", name) say_hello() # print(name) # Ошибка: name не определена

📌 name существует только в пределах функции say_hello.


🌐 Глобальные переменные

Определение:

Глобальная переменная — это переменная, объявленная вне всех функций. Она доступна в любом месте файла (если не перекрыта локальной).

python
language = "Python" # глобальная переменная def show(): print("Язык:", language) show() # Язык: Python

⚠️ Что если попытаться изменить глобальную переменную внутри функции?

python
counter = 0 def increment(): counter += 1 # Ошибка!

📛 Возникает UnboundLocalError, потому что Python считает counter локальной переменной (из-за +=), но она не определена.


🔑 Ключевое слово global

Чтобы изменить глобальную переменную внутри функции, используйте ключевое слово global.

python
count = 0 def increment(): global count count += 1 increment() print(count) # 1

🔁 Использование глобальных переменных в циклах и логике

python
total = 0 def add(x): global total total += x

Такой подход работает, но часто считается плохой практикой, особенно в больших проектах.


🧭 Область видимости в Python: LEGB Rule

Python ищет переменные по правилу LEGB:

  1. L — Local (внутри функции);

  2. E — Enclosing (вложенные функции);

  3. G — Global (модуль);

  4. B — Built-in (встроенные имена, как print, len).

Пример:

python
x = "global" def outer(): x = "enclosing" def inner(): x = "local" print(x) inner() outer() # local

🧩 Нюанс: nonlocal

Ключевое слово nonlocal используется для доступа к переменным из внешней, но не глобальной области видимости (во вложенных функциях):

python
def outer(): count = 0 def inner(): nonlocal count count += 1 return count return inner f = outer() print(f()) # 1 print(f()) # 2

🛡️ Приватные переменные в Python

Python не поддерживает настоящую приватность, но по соглашению:

  • _var — "приватная переменная" (для внутреннего использования);

  • __var — "защищённая" (name mangling);

  • __var__ — магическая переменная (не трогать).

Пример:

python
class MyClass: def __init__(self): self._private = 123 self.__very_private = "секрет" obj = MyClass() print(obj._private) # Доступ есть # print(obj.__very_private) # Ошибка print(obj._MyClass__very_private) # Работает (name mangling)

📊 Сравнение локальных и глобальных переменных

Параметр Локальная Глобальная
Область действия Только внутри функции Во всём модуле
Перезапись в функции Да Только с global
Риск побочных эффектов Минимальный Высокий
Рекомендуемость Рекомендуется Избегать при возможности

🧠 Когда использовать глобальные переменные?

✅ Подходящие случаи:

  • Константы (PI = 3.14);

  • Настройки по умолчанию;

  • Глобальные флаги (DEBUG = True);

  • Кэширование, если нет других способов.

❌ Не стоит:

  • Изменять глобальное состояние из разных функций;

  • Использовать глобальные переменные для обмена данными между функциями — это делает код хрупким и нечитаемым.


🧪 Кейсы из практики

Кейс 1: Счётчик вызовов функции

❌ Плохо:

python
count = 0 def handler(): global count count += 1

✅ Лучше:

python
def counter(): count = 0 def inner(): nonlocal count count += 1 return count return inner

✅ Рекомендации

  • Используйте локальные переменные по умолчанию.

  • Избегайте глобальных переменных для состояния.

  • Объявляйте глобальные константы ЗАГЛАВНЫМИ буквами.

  • Приватность обеспечивайте по соглашению: _var или __var.


❓FAQ

Как объявить глобальную переменную в Python?
Вне всех функций. Для изменения внутри функции — используйте global.

Что такое nonlocal?
Позволяет изменять переменные из внешней (но не глобальной) функции.

Есть ли настоящие приватные переменные?
Нет. Приватность в Python — договорённость, а не механизм безопасности.

Можно ли использовать глобальные переменные?
Можно, но осознанно и только для констант или конфигурации.


🔚 Заключение

Локальные и глобальные переменные — основа работы с памятью и логикой в Python. Локальные переменные — безопасный и изолированный способ работы. Глобальные переменные — мощный, но рискованный инструмент.

📌 Главное:

  • Локальные переменные — по умолчанию;

  • Глобальные — только при необходимости;

  • Приватность в Python реализуется по соглашению, а не механике.

Новости