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

В чем разница между методами списка Append и Extend в Python?

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

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Разница между методами append() и extend() в Python

В Python методы append() и extend() используются для добавления элементов в список (list), но они принципиально различаются по своему поведению и применению. Понимание этой разницы критически важно для корректной работы с коллекциями и избежания распространённых ошибок.

Основное отличие в поведении

  • append() добавляет переданный объект целиком как единый элемент в конец списка. Если вы передаёте итерируемый объект (например, другой список), он будет добавлен как вложенный список.
  • extend() "расширяет" список, добавляя элементы из переданного итерируемого объекта по отдельности в конец списка.

Детальное сравнение с примерами

Использование append()

Метод append() принимает один аргумент (любого типа) и добавляет его в конец списка. Размер списка увеличивается ровно на 1.

# Пример 1: Добавление простого элемента
my_list = [1, 2, 3]
my_list.append(4)
print(my_list)  # Результат: [1, 2, 3, 4]

# Пример 2: Добавление списка как элемента (создаётся вложенность)
my_list = [1, 2, 3]
new_elements = [4, 5]
my_list.append(new_elements)
print(my_list)  # Результат: [1, 2, 3, [4, 5]]
print(len(my_list))  # Результат: 4 (а не 5!)

Использование extend()

Метод extend() принимает итерируемый объект (список, кортеж, строку, множество и т.д.) и добавляет каждый его элемент по отдельности в конец списка.

# Пример 1: "Расширение" другим списком
my_list = [1, 2, 3]
new_elements = [4, 5]
my_list.extend(new_elements)
print(my_list)  # Результат: [1, 2, 3, 4, 5]
print(len(my_list))  # Результат: 5

# Пример 2: Расширение кортежем
my_list = [1, 2, 3]
my_list.extend((4, 5))
print(my_list)  # Результат: [1, 2, 3, 4, 5]

# Пример 3: Расширение строкой (строка — итерируемый объект из символов)
my_list = ['a', 'b']
my_list.extend('cde')
print(my_list)  # Результат: ['a', 'b', 'c', 'd', 'e']

Ключевые отличия в таблице

Критерийappend(x)extend(iterable)
Тип аргументаЛюбой объектТолько итерируемый объект
Эффект на списокДобавляет x как один элементДобавляет элементы iterable по одному
Увеличение длиныУвеличивается на 1Увеличивается на len(iterable)
Результат для списка[1, 2, 3].append([4, 5])[1, 2, 3, [4, 5]][1, 2, 3].extend([4, 5])[1, 2, 3, 4, 5]
АналогияПоложить коробку в контейнерВысыпать содержимое коробки в контейнер

Производительность и внутренняя реализация

С точки зрения производительности оба метода имеют амортизированную сложность O(1) для добавления одного элемента, но при работе с большими итерируемыми объектами extend() обычно эффективнее, чем последовательные вызовы append() в цикле, поскольку оптимизирован на уровне реализации CPython.

# НЕЭФФЕКТИВНО (множество вызовов метода)
my_list = []
for item in range(1000):
    my_list.append(item)

# ЭФФЕКТИВНО (один вызов метода)
my_list = []
my_list.extend(range(1000))

Практические рекомендации для QA Automation

  1. Для добавления единичного элемента (результата проверки, флага, объекта) всегда используйте append().
  2. Для объединения списков (например, сбор результатов из нескольких тестовых прогонов) используйте extend() или оператор +=.
  3. При сомнениях в типе данных используйте проверку isinstance() или выбирайте метод явно: append() для целостного добавления, extend() для "разворачивания".
# Пример из практики автоматизации тестирования
test_results = []
# Добавляем отдельный результат теста (словарь)
test_results.append({'test': 'login', 'status': 'passed', 'time': 1.2})

# Объединяем результаты нескольких модулей
module_a_results = [{'test': 'search', 'status': 'passed'}, {'test': 'filter', 'status': 'failed'}]
test_results.extend(module_a_results)  # Все словари добавляются как отдельные элементы

print(test_results)
# Результат: [{'test': 'login', 'status': 'passed', 'time': 1.2},
#             {'test': 'search', 'status': 'passed'},
#             {'test': 'filter', 'status': 'failed'}]

Распространённые ошибки

  • Путаница между объектом и его элементами: list.append([1, 2]) создаст вложенный список, а не добавит числа 1 и 2.
  • Передача неитерируемого объекта в extend(): list.extend(123) вызовет TypeError, так как целое число не является итерируемым.
  • Попытка использовать extend() для добавления None: list.extend([None]) добавит элемент None, а list.append(None) сделает то же самое, но семантически append() уместнее.

Вывод: Выбор между append() и extend() зависит от вашей цели — добавить объект как единое целое или объединить коллекции. Правильное использование этих методов делает код чище, эффективнее и предотвращает логические ошибки при работе со структурами данных в тестовых скриптах и фикстурах.