Перейти к содержанию

432 уроков, 26 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 3 из 20 Начальный 15 мин 100 XP

Python insert и extend: вставка по индексу и добавление пачкой

insert ставит элемент по индексу и сдвигает остальных вправо, extend раскладывает пачку на отдельные элементы. Оба меняют список на месте и возвращают None.

Редакция Питоники

append из прошлого урока кладёт элементы только в конец. Две соседние задачи он не закрывает: поставить значение на конкретное место — вторым пунктом в плане, первым в очередь — и добавить сразу готовую пачку значений, а не по одному. Для них у списка есть методы insert и extend. Оба, как и append, меняют список на месте и возвращают None, но работают по-разному, и путаница между ними — источник тихих ошибок. Разберём оба по очереди.

insert: вставка на место

Метод принимает два аргумента: индекс, куда встать, и само значение. Всё, что стояло правее, сдвигается на одну позицию вправо:

вставка в середину и в начало
tasks = ['помыть пол', 'купить хлеб']
tasks.insert(1, 'позвонить маме')
print(tasks)
tasks.insert(0, 'выключить утюг')
print(tasks)
Вывод
['помыть пол', 'позвонить маме', 'купить хлеб']
['выключить утюг', 'помыть пол', 'позвонить маме', 'купить хлеб']

Первый вызов поставил звонок маме на индекс 1 — между полом и хлебом, второй поставил утюг в начало. Вставка не заменяет, а раздвигает: длина каждый раз растёт на единицу, ни один элемент не потерялся. Индекс 0 — это всегда начало списка, откуда и растёт нумерация из урока про индексы.

insert не падает на большом индексе

Логика подсказывает: если индекс больше длины списка, Python должен ругнуться. На деле он ведёт себя тише:

индекс за пределами длины
tasks = ['купить хлеб']
tasks.insert(99, 'помыть пол')
print(tasks)
print(len(tasks))
Вывод
['купить хлеб', 'помыть пол']
2

Индекс 99 при одном элементе не вызвал ошибки: insert молча добавил задачу в конец. Ошибку выдаёт только отрицательный сдвиг дальше начала, например insert(-99, x) — элемент ляжет в начало. Это ловушка: опечатка в индексе не падает, а тихо меняет место вставки, и список оказывается не тем, что планировалось. Проверяйте индексы по правилам урока про индексы — там же о честной ошибке IndexError при чтении.

extend: добавить пачку

extend принимает коллекцию, раскладывает её на отдельные элементы и дописывает их в конец. В корзину приехала целая доставка:

extend дописывает элементы списка
cart = ['хлеб']
cart.extend(['яйца', 'сок', 'сыр'])
print(cart)
print(len(cart))
Вывод
['хлеб', 'яйца', 'сок', 'сыр']
4

Три товара легли тремя отдельными элементами, длина выросла с одного до четырёх. Разницу с append видно лучше всего на одинаковом входе — рядом, в одном коде:

append и extend на одном входе
a = [1, 2]
b = [1, 2]
a.append([3, 4])
b.extend([3, 4])
print(a)
print(b)
print(len(a), len(b))
Вывод
[1, 2, [3, 4]]
[1, 2, 3, 4]
3 4

append кладёт в конец один предмет, extend высыпает содержимое коробки: список в аргументе разворачивается в отдельные элементы. Отсюда правило выбора: по одному значению — append, готовой коллекцией — extend. Путаница между ними даёт либо лишнюю вложенность, либо недостающие элементы, поэтому проверяйте len после пополнения — как в уроке про len.

extend раскладывает строки на буквы

extend принимает любое перебираемое, а строка перебирается по символам. Поэтому extend от строки добавляет отдельные буквы, а не одну строку:

extend от строки
letters = ['а', 'б']
letters.extend('вг')
print(letters)
print(len(letters))
Вывод
['а', 'б', 'в', 'г']
4

Две буквы строки легли двумя элементами. Хотите положить строку как единое целое — используйте append: он не разбирает аргумент на части. Заодно extend работает и с range — пачка чисел из диапазона добавляется без цикла:

extend от range
nums = [1, 2]
nums.extend(range(3, 6))
print(nums)
print(len(nums))
Вывод
[1, 2, 3, 4, 5]
5

extend требует перебираемое

Число перебирать нельзя, поэтому extend от одного числа падает. Перехватим ошибку и заодно покажем правильный путь — append:

extend от числа падает
nums = [1, 2]
try:
    nums.extend(3)
except TypeError as e:
    print('Ошибка:', e)
nums.append(3)
print(nums)
Вывод
Ошибка: 'int' object is not iterable
[1, 2, 3]

Сообщение говорит прямо: 'int' object is not iterable — число не перебирается, раскладывать нечего. Правило то же, что у set() из курса про множества: extend и set едят то, по чему умеет идти for. Если хочется добавить именно одно значение — это append, а не extend.

так падает extend без try/except
nums = [1, 2]
nums.extend(3)
Вывод
Traceback (most recent call last):
  File "app.py", line 2, in <module>
    nums.extend(3)
    ~~~~~~~~~~~^^^
TypeError: 'int' object is not iterable
Путь к файлу в traceback условный, у вас он будет свой.

Три способа пополнения рядом

Соберём append, insert и extend в одну таблицу — по ней удобно проверять себя, когда список растёт не так, как планировалось:

ВызовКуда кладётДлина вырастет на
append(x)В конец1 — x становится одним элементом
insert(i, x)На индекс i, остальные сдвигаются1 — даже при i больше длины, но тогда в конец
extend(коллекция)В конец, раскладывая на элементыЧисло элементов в коллекции
append([a, b])В конец одним вложенным элементом1 — внутри окажется подсписок

Пополнение списка теперь закрыто полностью: append для одного значения, insert для места, extend для пачки. Обратная сторона — удаление: по значению, с возвратом и по индексу. Три способа убрать элемент разбирает следующий урок.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

nums = [10, 20]
nums.insert(1, 15)
nums.append(30)
print(nums)
a = [1]
b = [1]
a.append('аб')
b.extend('аб')
print(a)
print(b)
tasks = ['а', 'б', 'в']
tasks.insert(99, 'г')
print(len(tasks))
print(tasks)
Проверь себя
0 / 6

1. Что делает tasks.insert(1, 'отчёт')?

2. Что произойдёт при tasks.insert(50, 'x'), если в tasks два элемента?

3. Чем extend([3, 4]) отличается от append([3, 4]) для списка [1, 2]?

4. Что добавит extend('аб') в список?

5. Что вернёт nums.extend(5)?

6. Что общего у append, insert и extend?

Карточки терминов
Запомнено: 0 / 7
Практика

Дан список tasks = ['написать отчёт', 'ответить на письма']. Вставьте задачу 'созвон с командой' вторым пунктом, допишите пачку ['план на неделю', 'проверить бюджет'] и напечатайте итоговый список и его длину.

practice.py
Вопросы и ответы по уроку

Как вставить элемент в середину списка в Python?

Методом insert: tasks.insert(1, 'отчёт') ставит значение на индекс 1 и сдвигает остальные элементы вправо. Список меняется на месте, длина растёт на единицу. Для начала списка используется insert(0, x), для конца — append.

Урок 2: append добавляет в конец

Чем insert отличается от append?

insert требует индекс и ставит элемент на указанное место, append всегда дописывает в конец. По скорости append дешевле: вставка в начало или середину передвигает все элементы правее. Оба метода возвращают None и меняют список на месте.

Как добавить список к списку в Python?

Методом extend: cart.extend(['яйца', 'сок']) допишет элементы в конец как отдельные значения. Оператор плюс тоже соберёт объединение, но построит новый список: cart + доплата оставит исходный cart без изменений. extend меняет список на месте и возвращает None.

Урок 15: копирование списков

Почему extend раскладывает строку на отдельные буквы?

Потому что extend принимает перебираемое, а строка перебирается по символам: 'аб' — это два символа. Поэтому extend('аб') добавит две буквы. Если нужна строка одним элементом, используйте append — он не разбирает аргумент на части.

Что будет, если insert указать индекс больше длины списка?

Ошибки не будет: элемент молча добавится в конец. insert проверяет только отрицательный уход за начало. Это тихая ловушка — опечатка в индексе меняет место вставки без падения программы, поэтому вычисленные индексы стоит проверять явно.

Урок 6: индексы и IndexError

Понравился урок? Сошлитесь на него

«append кладёт в конец один предмет, extend высыпает содержимое коробки: список в аргументе разворачивается в отдельные элементы.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.