Короткий ответ
append() добавляет один элемент в конец списка (даже если этот элемент сам является списком), extend() добавляет все элементы из переданного итерируемого объекта по отдельности в конец, а insert(index, value) вставляет один элемент по конкретному индексу, сдвигая остальные.
Как это работает подробнее
lst.append(x) увеличивает длину списка на 1, добавляя сам объект x целиком как один элемент. lst.extend(iterable) проходит по iterable и добавляет каждый его элемент как отдельный элемент lst, то есть длина увеличивается на количество элементов в iterable. lst.insert(i, x) сдвигает элементы, начиная с индекса i, вправо и помещает x на позицию i.
Пример кода
example.py
numbers = [1, 2, 3]
numbers_wrong = numbers.copy()
numbers_wrong.append([4, 5])
print(numbers_wrong) # [1, 2, 3, [4, 5]] — вложенный список, не то, что ожидали
numbers_right = numbers.copy()
numbers_right.extend([4, 5])
print(numbers_right) # [1, 2, 3, 4, 5]
numbers_right.insert(0, 0)
print(numbers_right) # [0, 1, 2, 3, 4, 5]Что использовать на практике
- Практика. Частая путаница — попытка "добавить список элементов" через
append():lst.append([1, 2, 3])добавит один элемент — сам список[1, 2, 3]— а не три числа; для этого нуженextend([1, 2, 3])илиlst += [1, 2, 3].insert()используют редко в горячих циклах, так как вставка в середину списка требует сдвига элементов и имеет линейную стоимость от размера списка.
Подводные камни
- Риски. Используют
append()вместоextend()при объединении списков и получают список списков вместо плоского списка. Также не замечают, чтоextend()принимает любой итерируемый объект, а не только list — например, строку, которая будет разбита на отдельные символы.