Программирование

Глобальные переменные в функциях Python: global и UnboundLocalError

Как создавать глобальные переменные в Python, использовать ключевое слово global в функциях, обращаться к ним из разных функций и избегать ошибки UnboundLocalError. Область видимости, примеры кода и лучшие практики для переменных в функциях.

Как создавать и использовать глобальные переменные внутри функций в программировании? Как правильно обращаться к глобальной переменной, определённой в одной функции, из других функций, и когда следует использовать ключевое слово ‘global’, чтобы избежать ошибки UnboundLocalError?

Глобальные переменные создаются вне функций и доступны из любого места программы, включая переменные в функциях, но для их изменения внутри функции в Python обязательно используйте ключевое слово global, чтобы избежать UnboundLocalError. Если вы пытаетесь обратиться к глобальной переменной, определённой в одной функции, из другой, помните: настоящие глобальные живут за пределами всех функций, а внутри — это локальные копии, если не указано иное. Область видимости глобальных переменных определяет правила: читайте свободно, меняйте осознанно.


Содержание


Что такое глобальные переменные и как их создавать

Глобальные переменные — это те, что объявлены на верхнем уровне модуля, вне любых функций или классов. В Python, например, вы просто пишете counter = 0 в начале файла, и она сразу доступна повсюду. Но стоп, не путайте: если объявить переменную внутри функции, она останется локальной, даже если имя совпадает с глобальной.

Почему это важно? Представьте, вы пишете счётчик кликов в веб-приложении. Объявляете clicks = 0 снаружи, и все функции могут его видеть. В pythonru.com чётко объясняют: глобальная переменная видна из любого места, если не затенена локальной с тем же именем. Создать её проще простого — без специальных ключевых слов, главное, место.

А в других языках? В C или JS похожий принцип, но с нюансами: в JS var на верхнем уровне становится глобальной, а let/const — модульной. Но фокус на Python, где python global решает 90% проблем.

python
# Глобальная переменная
total = 100

def show_total():
 print(total) # Работает, читаем

Видишь? Без хлопот.


Область видимости глобальных переменных

Область видимости глобальных переменных — это вся программа, от начала до конца модуля. Локальные же живут только внутри своей функции. Python проверяет области по LEGB-правилу: Local, Enclosing, Global, Built-in. Сначала ищет локально, потом глобально.

Но вот засада: если в функции вы пишете x = x + 1, Python решает, что x — локальная (из-за присваивания), и ругается на чтение до записи. В younglinux.info подчёркивают: глобальные видны везде, но для записи нужен флаг.

Хотите пример?

python
x = 5 # Глобальная

def func():
 print(x) # 5, ок
 x = 10 # Теперь x локальная!

Здесь вторая строка создаст локальную x. А если функция вложенная? Тогда nonlocal для enclosing-области. Но для чистых глобальных — всегда global.

Это спасает от багов: представьте, меняете счётчик в одной функции, а в другой он не обновился. Область видимости — ваш щит.


Использование global в функциях Python

Ключевое слово global в Python говорит: “Эй, интерпретатор, это не новая локальная переменная, а та глобальная!”. Используйте его в начале функции, перед любым присваиванием. Без него — только чтение.

Пример из жизни: считаем сумму в нескольких функциях.

python
summa = 0

def add_a():
 global summa
 summa += 10

def add_b():
 global summa
 summa += 20

add_a()
add_b()
print(summa) # 30

Работает! По данным codechick.io, без global каждая функция слепит свою копию, и глобальная не меняется. Когда применять? Только если переменные в функциях реально нужно делить глобально — для счётчиков, конфигов.

А если читать? global не нужен. Простая экономия строк. Но переусердствовать нельзя: глобальные усложняют отладку.


Ошибка UnboundLocalError и как её избежать

UnboundLocalError: local variable referenced before assignment — классика Python. Возникает, когда функция пытается прочитать переменную до её локального присваивания, но Python уже решил, что она локальная.

Смотрите код-убийцу:

python
c = 10
def mul():
 print(c) # Ошибка!
 c *= 2
mul()

Python видит c *= 2 и помечает c как локальную целиком. Чтение — до присваивания — бум! Решение: global c в начале mul().

В pythonru.com разбирают это на пальцах: global для изменения, иначе ошибка. Избегайте, возвращая значения функций вместо глобальных — чище код.

Ещё трюк: используйте global только если уверены. Тестируйте: запустите без — увидите ошибку сразу.


Обращение к глобальным переменным из разных функций

Глобальная переменная, определённая вне функций (не внутри!), доступна из всех. Из одной функции в другую? Прямо по имени для чтения. Для записи — global в каждой.

Пример: логгер.

python
log_level = "INFO" # Глобальная

def log_info(msg):
 global log_level
 if log_level == "INFO":
 print(msg)

def set_debug():
 global log_level
 log_level = "DEBUG"

set_debug() меняет для всех. Но если “определена в одной функции”? Тогда это локальная! Чтобы поделиться, возвращайте её или используйте класс/модуль. В sky.pro советуют: аргументы лучше глобальных.

Вопрос: а если модуль импортируете? Глобальные модуля видны через module.var. Не создавайте в функциях — они не уйдут дальше.


Лучшие практики и альтернативы

Глобальные удобны, но не злоупотребляйте: они усложняют тесты, многопоточность (race conditions!). Лучше классы, словари или dataclasses.

Альтернативы:

  • Аргументы/возврат: def func(x): return x * 2
  • Классы: self.counter
  • Контексты: from contextlib import contextmanager
  • Окружение: os.environ

В pythonworld.ru предупреждают: без global функция безопасна, не меняет внешнее. Как сделать переменную глобальной? Объявите снаружи. Для python глобальные переменные в функциях — sparingly.

Когда global? Редко: константы, флаги. Иначе — refactoring time.


Источники

  1. Глобальные переменные в Python: как использовать на примерах global
  2. Глобальные, локальные и нелокальные переменные в Python
  3. Локальные и глобальные переменные в Python. Области видимости
  4. Часто задаваемые вопросы | Python 3 для начинающих
  5. Использование глобальных переменных в функциях

Заключение

Глобальные переменные — мощный инструмент для глобальные переменные в программировании, но ключ в понимании области видимости: создавайте вне функций, читайте свободно, меняйте с global. Избегайте UnboundLocalError, объявляя global timely, и предпочитайте альтернативы для чистоты кода. В итоге, меньше глобальных — happier разработка.

Авторы
Проверено модерацией
Модерация