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

Ответ

Методы append() и extend() изменяют исходный список, но делают это по-разному. Понимание этой разницы критично для корректной работы с коллекциями данных в тестах.

list.append(item)

  • Добавляет один элемент item в конец списка.
  • Если item является итерируемым объектом (например, другим списком), он будет добавлен как один вложенный элемент.
  • Длина списка увеличивается ровно на 1.

list.extend(iterable)

  • Добавляет в конец списка все элементы из итерируемого объекта iterable.
  • Итерируемый объект «раскрывается», его элементы добавляются по отдельности.
  • Длина списка увеличивается на длину iterable.

Наглядный пример с тестовыми данными:

# Исходные данные
test_results = ["PASS", "FAIL"]
new_batch_single = "SKIP"
new_batch_multiple = ["PASS", "PASS", "FAIL"]

# append() - добавляет элемент как есть
test_results.append(new_batch_multiple)
print(test_results)  # Вывод: ['PASS', 'FAIL', ['PASS', 'PASS', 'FAIL']]

# extend() - «раскрывает» итерируемый объект
test_results = ["PASS", "FAIL"]  # Сброс
test_results.extend(new_batch_multiple)
print(test_results)  # Вывод: ['PASS', 'FAIL', 'PASS', 'PASS', 'FAIL']

# append() для одиночного элемента
test_results.append(new_batch_single)
print(test_results)  # Вывод: ['PASS', 'FAIL', 'PASS', 'PASS', 'FAIL', 'SKIP']

Типичные ошибки и применение в QA:

  • Ошибка: Использовать append() для добавления элементов из другого списка, что приводит к неожиданной вложенности и усложняет последующие проверки (например, assert "PASS" in results).
  • Правильно: Использовать extend() для объединения списков, например, при агрегации результатов нескольких прогонов тестов или сборе данных из разных источников.
  • append() идеален для добавления одиночных результатов, логов или объектов.

Ответ 18+ 🔞

Давай разберём эту тему, а то я видел, как народ тут путается, прям волнение ебать. Всё просто, как два пальца об асфальт, но если не понять разницу — потом сам от себя охуеешь, когда твои тесты начнут глючить.

Представь, что у тебя есть список с результатами, типа ["PASS", "FAIL"]. И вот приходит новый пакет данных. Как его добавить? Вот тут и начинается магия.

list.append(item) — это как взять коробку и сунуть её в контейнер.

  • Кидаешь в конец списка один элемент, что угодно.
  • Если этот элемент — другой список, то он так целиком и влезет, как вложенная коробка. Список внутри списка, ёпта.
  • Длина твоего основного списка вырастет ровно на единичку. Добавил один элемент — плюс одна позиция.

list.extend(iterable) — это как взять ту же коробку, вытряхнуть из неё всё содержимое и запихнуть в контейнер по отдельности.

  • Он берёт итерируемую хрень (список, кортеж) и раскрывает её, добавляя каждый внутренний элемент по очереди.
  • Длина списка увеличится на столько, сколько было элементов в той коробке.

Смотри на живом примере, чтобы в голове щёлкнуло:

# Исходные данные
test_results = ["PASS", "FAIL"]
new_batch_single = "SKIP"
new_batch_multiple = ["PASS", "PASS", "FAIL"]

# append() - добавляет элемент как есть
test_results.append(new_batch_multiple)
print(test_results)  # Вывод: ['PASS', 'FAIL', ['PASS', 'PASS', 'FAIL']]
# Видишь? Целый список внутри засел. Теперь у тебя там вложенность, мудя.

# extend() - «раскрывает» итерируемый объект
test_results = ["PASS", "FAIL"]  # Сброс
test_results.extend(new_batch_multiple)
print(test_results)  # Вывод: ['PASS', 'FAIL', 'PASS', 'PASS', 'FAIL']
# А вот тут уже всё ровно, все элементы на одном уровне. Красота.

# append() для одиночного элемента
test_results.append(new_batch_single)
print(test_results)  # Вывод: ['PASS', 'FAIL', 'PASS', 'PASS', 'FAIL', 'SKIP']
# Строку 'SKIP' добавил как один элемент. Всё логично.

Где наступают и как не обосраться в QA:

  • Классическая лажа: Использовать append() там, где надо extend(). Хочешь добавить кучу результатов из нового прогона, а вместо этого получаешь список в списке. Потом пытаешься сделать assert "PASS" in results, а он нихуя не находит, потому что "PASS" сидит внутри вложенной структуры. Удивление пиздец.
  • Правильный путь: extend() — твой друг для агрегации. Собрал логи из трёх разных модулей, получил три списка — протянул их все в один общий. Всё плоское и удобное для анализа.
  • append() в дело: Идеален, когда добавляешь что-то единичное. Один итоговый статус теста, один объект с метаданными, одно сообщение об ошибке. Работает чётко.

Запомни: хочешь добавить КОРОБКУ — append. Хочешь добавить СОДЕРЖИМОЕ коробки — extend. Всё, больше путаницы не будет, ядрёна вошь.