← Назад к вопросам

Как изнутри тела функции можно изменить глобальный объект?

1.0 Junior🔥 151 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Изменение глобального объекта внутри функции

В 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"  # Явный результат
Как изнутри тела функции можно изменить глобальный объект? | PrepBro