Как изнутри тела функции можно изменить глобальный объект?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Изменение глобального объекта внутри функции
В Python существует несколько способов изменить глобальный объект из тела функции:
1. Ключевое слово global
Для простых переменных используется ключевое слово global, которое указывает Python, что мы работаем с глобальной переменной, а не создаём локальную:
counter = 0
def increment():
global counter
counter += 1
increment()
print(counter) # 1
Без ключевого слова global Python создаст локальную переменную и вызовет ошибку UnboundLocalError.
2. Изменение содержимого объектов (без global)
Для изменяемых объектов (списки, словари, объекты) можно менять их содержимое без ключевого слова global, так как мы работаем со ссылкой на объект:
users = []
cfg = {"debug": False}
def add_user(name):
users.append(name) # Меняем содержимое
def enable_debug():
cfg["debug"] = True # Меняем значение в словаре
add_user("Alice")
enable_debug()
print(users) # ["Alice"]
print(cfg) # {"debug": True}
3. Ключевое слово nonlocal для замыканий
Для изменения переменной из внешней функции используется nonlocal:
def outer():
count = 0
def inner():
nonlocal count
count += 1
inner()
return count
print(outer()) # 1
4. Использование модуля sys.modules
Можно получить модуль и менять его атрибуты:
import sys
def modify_module():
current_module = sys.modules[__name__]
current_module.global_var = 42
global_var = 0
modify_module()
print(global_var) # 42
Важные нюансы
Хорошая практика: избегайте глобального состояния — используйте параметры функций и возвращаемые значения. Это делает код предсказуемым и тестируемым.
Плохой пример:
status = "idle"
def process():
global status
status = "running" # Скрытое изменение состояния
Хороший пример:
def process(status="idle"):
return "running" # Явный результат