Методы append() и extend() у списков в Python служат для добавления элементов, однако делают это принципиально по-разному:
append(obj) добавляет один элемент (любой объект — в том числе список) в конец исходного спискаextend(iterable) добавляет все элементы итерируемого объекта по одному (как бы "раскрывает" его при добавлении)Пример:
lst = [1, 2, 3] lst.append([4, 5]) # Результат: [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # Результат: [1, 2, 3, 4, 5]
Такая разница часто становится причиной логических ошибок, когда ожидают "плоский" список, а получают вложенные.
Что будет, если сделать
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)? Как выглядит list1? Чем отличается отlist1.extend(list2)?
Ответ:
list1.append(list2) результат: [1, 2, [3, 4]] — второй список добавился как один элемент (вложенный список)list1.extend(list2) результат: [1, 2, 3, 4] — элементы второго списка "развёрнуты" и добавлены как отдельные элементыИстория
Разработчик при объединении результатов парсинга из нескольких файлов делал
output.append(parsed_lines). В результате вместо длинного плоского списка получал список списков (один элемент на каждый файл), что ломало всю дальнейшую обработку — в частности, функции, ожидавшие последовательность строк, начали выдавать ошибки на входных данных.
История
В проекте использовался extend для добавления строки вида "foo" (то есть строка рассматривалась как итерируемый). Это привело к тому, что символы строки стали отдельными элементами списка:
['f', 'o', 'o']вместо хотимого "foo".
История
При сериализации данных для передачи в JSON к итоговому списку применялись append/extend в цикле без понимания различия. В результате получались структуры, нарушавшие схему, из-за чего часть микросервисов начинала падать на этапе валидации или работать некорректно.