Глобальная переменная global: когда и зачем нужна

Глобальная переменная global: когда и зачем нужна Функции

Привет! В прошлой статье мы познакомились с областями видимости переменных. Узнали, что внутри функции можно читать глобальные переменные, но для их изменения нужно ключевое слово global.

Но зачем вообще менять глобальные переменные? И когда это оправдано?

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

  • Что такое global
  • Когда использовать global
  • Альтернативы global
  • Примеры из реальной жизни
  • Когда global — это плохо

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание функций и областей видимости

Совет: global — это мощный инструмент, но использовать его нужно с умом.

Основная часть

Что делает global

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

counter = 0

def increment():
    global counter
    counter += 1

increment()
increment()
print(counter)   # 2

Важно: Без global Python создаст локальную переменную с тем же именем, а глобальная останется неизменной.

counter = 0

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

def increment():
    counter = 5             # Локальная переменная

Когда использовать global

global полезен в нескольких ситуациях:

  1. Счётчики — подсчёт вызовов функций
  2. Настройки приложения — глобальные конфиги
  3. Кэширование — хранение данных между вызовами
  4. Сбор статистики — логирование, метрики

Пример: счётчик вызовов

call_count = 0

def my_function():
    global call_count
    call_count += 1
    print(f"Функция вызвана {call_count} раз")

my_function()   # Функция вызвана 1 раз
my_function()   # Функция вызвана 2 раз
my_function()   # Функция вызвана 3 раз

Пример: настройки приложения

DEBUG = True
LANGUAGE = 'ru'

def set_debug_mode(enabled):
    global DEBUG
    DEBUG = enabled

def set_language(lang):
    global LANGUAGE
    LANGUAGE = lang

set_debug_mode(False)
print(DEBUG)   # False

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

В большинстве случаев global можно избежать. Вот альтернативы:

1. Передача параметров

# Вместо global
def increment(counter):
    return counter + 1

counter = 0
counter = increment(counter)
counter = increment(counter)
print(counter)   # 2

2. Использование словаря

config = {
    'debug': True,
    'language': 'ru'
}

def set_debug_mode(enabled):
    config['debug'] = enabled

set_debug_mode(False)
print(config['debug'])   # False

3. Использование класса

class Counter:
    def __init__(self):
        self.count = 0

    def increment(self):
        self.count += 1

counter = Counter()
counter.increment()
counter.increment()
print(counter.count)   # 2

4. Использование замыканий

def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

counter = make_counter()
print(counter())   # 1
print(counter())   # 2
print(counter())   # 3

Совет: Передача параметров — самый чистый способ. Избегай global, когда это возможно.

Когда global — это плохо

Использование global усложняет тестирование и отладку:

  • Глобальные переменные создают скрытые зависимости
  • Код становится менее предсказуемым
  • Тестирование усложняется (состояние сохраняется между тестами)
# Плохо: глобальное состояние
users = []

def add_user(name):
    global users
    users.append(name)

# Хорошо: параметры
def add_user(users, name):
    users.append(name)
    return users

Совет: Старайся использовать global только для конфигураций и кэшей, но не для логики приложения.

Множественные глобальные переменные

Можно объявить несколько переменных в одной строке:

x = 10
y = 20
z = 30

def update():
    global x, y, z
    x += 1
    y += 2
    z += 3

update()
print(x, y, z)   # 11 22 33

Глобальные переменные в модулях

Глобальные переменные видны во всём модуле и могут быть импортированы в другие модули.

# module.py
CONFIG = {'debug': True}

def set_debug(enabled):
    global CONFIG
    CONFIG['debug'] = enabled

# main.py
import module
module.set_debug(False)
print(module.CONFIG)   # {'debug': False}

Задачи для закрепления

Задача 1. Что выведет код?

x = 5
def func():
    x = 10
    print(x)
func()
print(x)

Задача 2. Как изменить глобальную переменную counter внутри функции?

Задача 3. Напиши функцию, которая увеличивает глобальный счётчик на 1.

Задача 4. Почему global считается плохой практикой?

Задача 5. Как избежать использования global для счётчика?

Ответы:

Задача 1.

# 10 (локальная x)
# 5 (глобальная x не изменилась)

Задача 2.

# Использовать global:
counter = 0
def func():
    global counter
    counter += 1

Задача 3.

counter = 0
def increment():
    global counter
    counter += 1

Задача 4.

# global создаёт скрытые зависимости, усложняет тестирование
# и делает код менее предсказуемым.

Задача 5.

# Использовать параметры:
def increment(counter):
    return counter + 1

# Или класс:
class Counter:
    def __init__(self):
        self.count = 0
    def increment(self):
        self.count += 1

Нюансы и подводные камни

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

Глобальные переменные из других модулей можно изменять через import.

# module.py
x = 10

# main.py
import module
module.x = 20

Переменные на уровне модуля

Все переменные, созданные вне функций, являются глобальными в рамках модуля.

Глобальные переменные и многопоточность

Глобальные переменные могут создавать проблемы в многопоточных приложениях (race conditions).

Частые ошибки и как их избежать

Ошибка 1: Изменение глобальной переменной без global

Всегда используй global для изменения глобальной переменной.

Ошибка 2: Создание локальной переменной с тем же именем

Если ты хочешь изменить глобальную, не создавай локальную с тем же именем.

Ошибка 3: Использование global для чтения

Для чтения global не нужен.

Шпаргалка

Что нужноКак пишется
Изменить глобальную переменнуюglobal x; x = 20
Изменить несколько глобальных переменныхglobal x, y, z
Прочитать глобальную переменнуюprint(x) (без global)
Альтернатива globalПередача параметров, классы, словари

Заключение

Сегодня мы:

  • Узнали, что такое global
  • Научились изменять глобальные переменные
  • Разобрали, когда использовать global
  • Рассмотрели альтернативы

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×