Привет! В прошлой статье мы познакомились с областями видимости переменных. Узнали, что внутри функции можно читать глобальные переменные, но для их изменения нужно ключевое слово global.
Но зачем вообще менять глобальные переменные? И когда это оправдано?
В этой статье мы разберём:
- Что такое
global - Когда использовать
global - Альтернативы
global - Примеры из реальной жизни
- Когда
global— это плохо
- Что нужно знать перед началом
- Основная часть
- Что делает global
- Когда использовать global
- Альтернативы global
- 1. Передача параметров
- 2. Использование словаря
- 3. Использование класса
- 4. Использование замыканий
- Когда global — это плохо
- Множественные глобальные переменные
- Глобальные переменные в модулях
- Задачи для закрепления
- Нюансы и подводные камни
- Глобальные переменные и import
- Переменные на уровне модуля
- Глобальные переменные и многопоточность
- Частые ошибки и как их избежать
- Ошибка 1: Изменение глобальной переменной без global
- Ошибка 2: Создание локальной переменной с тем же именем
- Ошибка 3: Использование global для чтения
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание функций и областей видимости
Совет:
global— это мощный инструмент, но использовать его нужно с умом.
Основная часть
Что делает global
Ключевое слово global позволяет изменять глобальную переменную внутри функции.
counter = 0
def increment():
global counter
counter += 1
increment()
increment()
print(counter) # 2Важно: Без
globalPython создаст локальную переменную с тем же именем, а глобальная останется неизменной.
counter = 0
def increment():
counter = counter + 1 # Ошибка! UnboundLocalError
def increment():
counter = 5 # Локальная переменнаяКогда использовать global
global полезен в нескольких ситуациях:
- Счётчики — подсчёт вызовов функций
- Настройки приложения — глобальные конфиги
- Кэширование — хранение данных между вызовами
- Сбор статистики — логирование, метрики
Пример: счётчик вызовов
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) # 22. Использование словаря
config = {
'debug': True,
'language': 'ru'
}
def set_debug_mode(enabled):
config['debug'] = enabled
set_debug_mode(False)
print(config['debug']) # False3. Использование класса
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
counter = Counter()
counter.increment()
counter.increment()
print(counter.count) # 24. Использование замыканий
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 - Рассмотрели альтернативы








