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

Нужно ли писать global при применении append к глобальной переменной типа list?

1.6 Junior🔥 201 комментариев
#Python Core

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

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

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

Global при работе с append() для глобального списка

Коротко: НЕТ, не нужно писать global. Это одна из частых ошибок понимания области видимости в Python.

Почему не нужен global для append()

Ключевой момент: global нужен только если ты переназначаешь переменную (присваиваешь ей новое значение). Если ты просто вызываешь метод объекта, то global не требуется.

Вот пример, который работает БЕЗ global:

my_list = [1, 2, 3]

def add_element():
    my_list.append(4)  # Работает! Нет global!

add_element()
print(my_list)  # [1, 2, 3, 4]

Это работает потому что append() — это метод списка, который изменяет объект in-place. Python находит глобальный список по имени и вызывает у него метод. Никакого переназначения не происходит.

Когда ВСЕ ЖЕ нужен global

Глобальная переменная нужна, если ты переназначаешь саму переменную:

my_list = [1, 2, 3]

def replace_list():
    global my_list
    my_list = [10, 20, 30]  # БЕЗ global будет ошибка!

replace_list()
print(my_list)  # [10, 20, 30]

Без global Python думает, что my_list — локальная переменная, и выдаст ошибку UnboundLocalError.

Сравнение методов изменения

my_list = [1, 2, 3]

# 1. append() — БЕЗ global ✅
def add_one():
    my_list.append(4)

# 2. extend() — БЕЗ global ✅
def add_many():
    my_list.extend([5, 6, 7])

# 3. += (переназначение!) — НУЖЕН global ❌
def use_plus_equals():
    global my_list
    my_list += [8, 9]

# 4. Полное переназначение — НУЖЕН global ❌
def replace():
    global my_list
    my_list = [0]

add_one()      # my_list = [1, 2, 3, 4]
add_many()     # my_list = [1, 2, 3, 4, 5, 6, 7]
use_plus_equals()  # my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
replace()      # my_list = [0]

Основное правило

  • Читаешь/вызываешь метод → никакого global не нужно
  • Переназначаешь переменную → нужен global

Это применимо не только к списками, но и к другим объектам:

my_dict = {'a': 1}

def update_dict():
    my_dict['b'] = 2  # БЕЗ global ✅

def replace_dict():
    global my_dict
    my_dict = {'x': 100}  # С global ✅

update_dict()
print(my_dict)  # {'a': 1, 'b': 2}
replace_dict()
print(my_dict)  # {'x': 100}

Почему это часто путают

Люди думают: "Я изменяю глобальный список, значит нужен global". На самом деле Python видит, что ты просто вызываешь метод append() на объекте, который найден в глобальной области видимости.

Хороший пример из реальной работы

# Логирование ошибок в список (без global)
error_log = []

def log_error(error_msg):
    error_log.append(f"ERROR: {error_msg}")

def log_warning(warning_msg):
    error_log.append(f"WARNING: {warning_msg}")

def get_logs():
    return error_log

log_error("Database connection failed")
log_warning("Slow query detected")
print(get_logs())
# ['ERROR: Database connection failed', 'WARNING: Slow query detected']

Best Practice

Вместо глобальных переменных лучше использовать классы или функции высшего порядка:

class Logger:
    def __init__(self):
        self.logs = []
    
    def append(self, msg):
        self.logs.append(msg)
    
    def get_logs(self):
        return self.logs

logger = Logger()
logger.append("Error occurred")
print(logger.get_logs())  # Чище, чем с global

Итог: используй global только когда переназначаешь переменную, для append() и других методов это не требуется.