Ответ
Методы 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. Всё, больше путаницы не будет, ядрёна вошь.