Глобальные переменные в функциях Python: global и UnboundLocalError
Как создавать глобальные переменные в Python, использовать ключевое слово global в функциях, обращаться к ним из разных функций и избегать ошибки UnboundLocalError. Область видимости, примеры кода и лучшие практики для переменных в функциях.
Как создавать и использовать глобальные переменные внутри функций в программировании? Как правильно обращаться к глобальной переменной, определённой в одной функции, из других функций, и когда следует использовать ключевое слово ‘global’, чтобы избежать ошибки UnboundLocalError?
Глобальные переменные создаются вне функций и доступны из любого места программы, включая переменные в функциях, но для их изменения внутри функции в Python обязательно используйте ключевое слово global, чтобы избежать UnboundLocalError. Если вы пытаетесь обратиться к глобальной переменной, определённой в одной функции, из другой, помните: настоящие глобальные живут за пределами всех функций, а внутри — это локальные копии, если не указано иное. Область видимости глобальных переменных определяет правила: читайте свободно, меняйте осознанно.
Содержание
- Что такое глобальные переменные и как их создавать
- Область видимости глобальных переменных
- Использование global в функциях Python
- Ошибка UnboundLocalError и как её избежать
- Обращение к глобальным переменным из разных функций
- Лучшие практики и альтернативы
- Источники
- Заключение
Что такое глобальные переменные и как их создавать
Глобальные переменные — это те, что объявлены на верхнем уровне модуля, вне любых функций или классов. В Python, например, вы просто пишете counter = 0 в начале файла, и она сразу доступна повсюду. Но стоп, не путайте: если объявить переменную внутри функции, она останется локальной, даже если имя совпадает с глобальной.
Почему это важно? Представьте, вы пишете счётчик кликов в веб-приложении. Объявляете clicks = 0 снаружи, и все функции могут его видеть. В pythonru.com чётко объясняют: глобальная переменная видна из любого места, если не затенена локальной с тем же именем. Создать её проще простого — без специальных ключевых слов, главное, место.
А в других языках? В C или JS похожий принцип, но с нюансами: в JS var на верхнем уровне становится глобальной, а let/const — модульной. Но фокус на Python, где python global решает 90% проблем.
# Глобальная переменная
total = 100
def show_total():
print(total) # Работает, читаем
Видишь? Без хлопот.
Область видимости глобальных переменных
Область видимости глобальных переменных — это вся программа, от начала до конца модуля. Локальные же живут только внутри своей функции. Python проверяет области по LEGB-правилу: Local, Enclosing, Global, Built-in. Сначала ищет локально, потом глобально.
Но вот засада: если в функции вы пишете x = x + 1, Python решает, что x — локальная (из-за присваивания), и ругается на чтение до записи. В younglinux.info подчёркивают: глобальные видны везде, но для записи нужен флаг.
Хотите пример?
x = 5 # Глобальная
def func():
print(x) # 5, ок
x = 10 # Теперь x локальная!
Здесь вторая строка создаст локальную x. А если функция вложенная? Тогда nonlocal для enclosing-области. Но для чистых глобальных — всегда global.
Это спасает от багов: представьте, меняете счётчик в одной функции, а в другой он не обновился. Область видимости — ваш щит.
Использование global в функциях Python
Ключевое слово global в 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 уже решил, что она локальная.
Смотрите код-убийцу:
c = 10
def mul():
print(c) # Ошибка!
c *= 2
mul()
Python видит c *= 2 и помечает c как локальную целиком. Чтение — до присваивания — бум! Решение: global c в начале mul().
В pythonru.com разбирают это на пальцах: global для изменения, иначе ошибка. Избегайте, возвращая значения функций вместо глобальных — чище код.
Ещё трюк: используйте global только если уверены. Тестируйте: запустите без — увидите ошибку сразу.
Обращение к глобальным переменным из разных функций
Глобальная переменная, определённая вне функций (не внутри!), доступна из всех. Из одной функции в другую? Прямо по имени для чтения. Для записи — global в каждой.
Пример: логгер.
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.
Источники
- Глобальные переменные в Python: как использовать на примерах global
- Глобальные, локальные и нелокальные переменные в Python
- Локальные и глобальные переменные в Python. Области видимости
- Часто задаваемые вопросы | Python 3 для начинающих
- Использование глобальных переменных в функциях
Заключение
Глобальные переменные — мощный инструмент для глобальные переменные в программировании, но ключ в понимании области видимости: создавайте вне функций, читайте свободно, меняйте с global. Избегайте UnboundLocalError, объявляя global timely, и предпочитайте альтернативы для чистоты кода. В итоге, меньше глобальных — happier разработка.