Как добавить элемент в список Python: append(), insert() и extend()

Чтобы добавить элемент в конец списка в Python, вызовите append().

В нужное место элемент ставит insert(), несколько значений сразу добавляют extend() и +=.

В инструкции шесть способов с выводом Python 3.14, разница между append и extend, частые ошибки и замер: вставка в начало списка оказалась примерно в тысячу раз медленнее.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2944 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3598 экспертных мнений Подписаться на Телеграм-канал
Обложка: Как добавить элемент в список Python: append(), insert() и extend()

Чтобы добавить элемент в список в Python, вызовите список.append(элемент): значение встанет в конец, исходный список изменится на месте. Нужна конкретная позиция, берите список.insert(индекс, элемент). Добавить сразу несколько значений помогает список.extend(другой_список) или оператор +=. Если исходный список трогать нельзя, соберите новый через +.

Ниже каждый способ с примером и реальным выводом Python 3.14, разница между append() и extend(), замер скорости и разбор ошибок. Что такое списки и где язык применяют, мы рассказали в обзоре языка Python.

CheckroiCheckroiПодборка курсов по Python566 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Какой способ выбрать

Рой добавляет новый элемент в конец списка на экране ноутбука

Шесть инструментов отличаются тем, куда попадает новое значение и меняется ли исходный список.

Задача Способ Куда добавляет Исходный список
Один элемент в конец a.append(x) в конец меняется
Один элемент в нужное место a.insert(i, x) перед индексом i меняется
Несколько элементов в конец a.extend(b), a += b в конец меняется
Склеить два списка в третий c = a + b, [*a, *b] в новый список не меняется
Несколько элементов в середину a[i:i] = [x, y] перед индексом i меняется
Часто добавлять в начало deque.appendleft(x) в начало это другая структура

Все методы списка описаны в разделе More on Lists официальной документации. Код из статьи удобно проверять в редакторе: вот как создать и запустить файл Python в VS Code. Если интерпретатора ещё нет, начните с инструкции, как скачать и установить Python.

Метод append(): один элемент в конец

append() принимает ровно один аргумент и дописывает его последним. В документации он описан как аналог записи a[len(a):] = [x].

fruits = ["яблоко", "груша"]
fruits.append("слива")
print(fruits)  # ['яблоко', 'груша', 'слива']

Добавить можно значение любого типа: число, строку, None, кортеж, словарь. Python не требует, чтобы элементы списка были одного типа.

row = []
row.append(42)
row.append("текст")
row.append(None)
row.append((1, 2))
row.append({"id": 7})
print(row)  # [42, 'текст', None, (1, 2), {'id': 7}]

Метод возвращает None

append() меняет список на месте и ничего не возвращает. Так устроены все методы, которые только изменяют список: в учебнике Python сказано, что они возвращают None по умолчанию.

nums = [1, 2, 3]
result = nums.append(4)
print(result, nums)  # None [1, 2, 3, 4]

Отсюда частая ошибка новичков: nums = nums.append(4). После такой строки в переменной лежит None, а следующий вызов падает с AttributeError: 'NoneType' object has no attribute 'append'.

Как заполнить пустой список в цикле

Классический приём: создать пустой список и в цикле дописывать в него значения. Так же удобно собирать только подходящие элементы, проверяя условие внутри цикла.

squares = []
for n in range(1, 6):
    squares.append(n * n)
print(squares)  # [1, 4, 9, 16, 25]

evens = []
for n in [3, 8, 11, 14, 20]:
    if n % 2 == 0:
        evens.append(n)
print(evens)  # [8, 14, 20]

Тот же результат даёт генератор списка в одну строку: [n * n for n in range(1, 6)] и [n for n in nums if n % 2 == 0]. Для простого правила он короче, а когда в теле цикла несколько шагов, понятнее for с append(). Если условие умещается в одно выражение, пригодится тернарный оператор Python.

Числа, которые пользователь ввёл одной строкой через пробел, собирают так:

line = "5 3 8"          # например, результат input()
nums = []
for part in line.split():
    nums.append(int(part))
print(nums)  # [5, 3, 8]
Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Метод insert(): в начало, середину или по индексу

insert(i, x) ставит элемент перед позицией i. Индексы считаются с нуля, поэтому insert(0, x) добавляет элемент в начало списка.

queue = ["Анна", "Борис", "Вера"]
queue.insert(0, "Глеб")
print(queue)  # ['Глеб', 'Анна', 'Борис', 'Вера']
queue.insert(2, "Дина")
print(queue)  # ['Глеб', 'Анна', 'Дина', 'Борис', 'Вера']

У insert() есть две особенности. Отрицательный индекс считает с конца, но вставка идёт перед ним, поэтому insert(-1, x) ставит элемент предпоследним. Индекс за границей списка ошибки не вызывает: элемент встанет в конец или в начало.

x = [1, 2, 3]
x.insert(-1, 99)
print(x)  # [1, 2, 99, 3]

y = [1, 2, 3]
y.insert(100, 4)
print(y)  # [1, 2, 3, 4]
y.insert(-100, 0)
print(y)  # [0, 1, 2, 3, 4]

Добавить в конец через insert тоже можно: по документации a.insert(len(a), x) равнозначен a.append(x). Как работают индексы и знаки вроде // и %, разобрано в статье про операторы Python.

extend() и +=: несколько элементов сразу

extend() принимает любой итерируемый объект (список, кортеж, range, строку) и дописывает его элементы по одному.

a = [1, 2, 3]
a.extend([4, 5])
a.extend((6, 7))
a.extend(range(8, 10))
print(a)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

Чем append() отличается от extend()

append() кладёт переданный объект целиком, одним элементом. extend() распаковывает его и добавляет содержимое.

a = [1, 2, 3]
a.append([4, 5])
print(a, len(a))  # [1, 2, 3, [4, 5]] 4

b = [1, 2, 3]
b.extend([4, 5])
print(b, len(b))  # [1, 2, 3, 4, 5] 5

Со строкой разница заметнее всего: extend("bc") добавит две буквы отдельно. Чтобы строка встала одним элементом, оберните её в список или вызовите append().

letters = ["a"]
letters.extend("bc")
print(letters)   # ['a', 'b', 'c']

letters = ["a"]
letters.extend(["bc"])
print(letters)   # ['a', 'bc']

Оператор += работает как extend()

Запись a += b меняет список на месте и принимает любой итерируемый объект, как extend(). В описании изменяемых последовательностей так и сказано: s += t расширяет s содержимым t. А вот a = a + b склеивает только список со списком:

a = [1, 2]
a += "ab"
print(a)  # [1, 2, 'a', 'b']

a = [1, 2]
a = a + "ab"
# TypeError: can only concatenate list (not "str") to list

Оператор + и распаковка: новый список

Плюс не трогает исходные списки и возвращает третий. Распаковка через звёздочку делает то же и умеет вставить отдельные значения между частями.

a = [1, 2]
b = [3, 4]
c = a + b
print(c, a, b)          # [1, 2, 3, 4] [1, 2] [3, 4]
print([*a, 99, *b])     # [1, 2, 99, 3, 4]

Разница между += и + важна, когда на один список ссылаются две переменные. += меняет общий объект, поэтому вторая переменная видит изменения. a = a + [3] создаёт новый список, и вторая переменная остаётся со старым:

a = [1, 2]
alias = a
a += [3]
print(alias)      # [1, 2, 3]

a = [1, 2]
alias = a
a = a + [3]
print(alias, a)   # [1, 2] [1, 2, 3]

Если функция получила список аргументом и не должна его портить, используйте +. Чем склейка списков отличается от суммы их элементов, разобрано в инструкции, как суммировать список в Python.

Срез: несколько элементов в середину

Присваивание пустому срезу вставляет сколько угодно элементов в любое место. insert() так не умеет: он добавляет по одному.

a = [1, 5]
a[1:1] = [2, 3, 4]     # перед индексом 1
print(a)  # [1, 2, 3, 4, 5]
a[len(a):] = [6, 7]    # в конец, как extend
print(a)  # [1, 2, 3, 4, 5, 6, 7]
a[:0] = [-1, 0]        # в начало
print(a)  # [-1, 0, 1, 2, 3, 4, 5, 6, 7]

Приём выглядит менее наглядно, чем методы, поэтому подпишите такую строку комментарием.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Скорость: почему insert(0) медленный

Новый кубик встаёт в начало ряда, остальные сдвигаются

Добавление в конец работает за постоянное время: в таблице сложности операций Python у append стоит O(1), у insert O(n), у extend O(k), где k это длина добавляемой коллекции. При вставке в начало Python сдвигает все остальные элементы, и чем длиннее список, тем дольше.

Мы замерили, сколько уходит на 100 000 добавлений (Python 3.14, три прогона):

Способ Время
list.insert(0, i) 1429–1501 мс
list.append(i) 1,41–1,50 мс
deque.appendleft(i) 1,92–2,08 мс
генератор списка 1,18–1,28 мс

Вставка в начало оказалась примерно в тысячу раз медленнее. Если элементы нужно часто добавлять с обеих сторон, возьмите deque из модуля collections: по документации он добавляет и с начала, и с конца примерно за O(1), а у списка на insert(0, v) уходит O(n) на сдвиг памяти.

from collections import deque

d = deque([2, 3])
d.appendleft(1)
d.append(4)
print(list(d))  # [1, 2, 3, 4]

Другой выход: дописывать через append(), а в конце один раз развернуть список методом reverse().

На списке из десяти элементов разницы не видно, на сотне тысяч она измеряется секундами. Где скорость Python мешает, а где незаметна, мы разобрали в статье о плюсах и минусах Python.

Если у вас массив NumPy

«Массивом» в Python часто называют обычный список, и для него подходит всё, что описано выше. У массивов NumPy метода append нет, есть функция np.append(). Она не меняет исходный массив: документация уточняет, что NumPy выделяет под результат новый массив и заполняет его.

import numpy as np

arr = np.array([1, 2, 3])
new = np.append(arr, 4)
print(arr, new)  # [1 2 3] [1 2 3 4]

Результат нужно присвоить переменной. В цикле np.append() каждый раз копирует массив целиком, поэтому значения выгоднее собрать в обычный список и превратить в массив один раз: np.array(список).

Частые ошибки и что с ними делать

Рой доволен: список собрался без ошибок

Вывод ошибок в таблице снят с Python 3.14.

Симптом Причина Решение
AttributeError: 'NoneType' object has no attribute 'append' Написали a = a.append(x), метод вернул None Вызывать a.append(x) без присваивания
TypeError: list.append() takes exactly one argument (2 given) Передали в append() два значения a.extend([x, y]) или два вызова append()
TypeError: 'int' object is not iterable Передали в extend() одно число Для одного значения append()
AttributeError: 'list' object has no attribute 'add' Метод add() есть у множества, у списка его нет append() для списка, add() для set
AttributeError: 'tuple' object has no attribute 'append' Кортеж неизменяемый Превратить в список: list(t)
Внутри списка оказался список append() добавил коллекцию одним элементом Заменить на extend()
Строка рассыпалась на буквы extend("слово") перебирает символы append("слово")

Все строки таблицы стали одинаковыми

Ещё одна ловушка без сообщения об ошибке: в цикле добавляют один и тот же список, меняя его содержимое. В итоговый список попадают три ссылки на один объект, и все показывают последнее значение.

row = [0, 0]
table = []
for i in range(3):
    row[0] = i
    table.append(row)
print(table)  # [[2, 0], [2, 0], [2, 0]]

Решение: создавать новый список на каждой итерации, table.append([i, 0]). По той же причине [[]] * 3 даёт три ссылки на один вложенный список. Пустую «таблицу» собирают генератором: [[] for _ in range(3)]. Как работают циклы и где ещё легко ошибиться, разобрано в статье про цикл while в Python.

Где освоить Python системно

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

Тем, кто думает о смене профессии, пригодится разбор, как стать Python-разработчиком.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология161 200 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что делает append в Python?

Метод append() добавляет один элемент в конец списка и меняет список на месте. Возвращает он None, поэтому результат вызова не присваивают переменной: пишут a.append(x), без a =.

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

append() добавляет переданный объект целиком, одним элементом: [1, 2].append([3, 4]) даст [1, 2, [3, 4]]. extend() перебирает коллекцию и добавляет её элементы по одному, получится [1, 2, 3, 4].

Как добавить элемент в начало списка?

Вызовите a.insert(0, x). На длинных списках это медленно: в нашем замере 100 000 вставок в начало заняли около 1,4 секунды против 1,5 миллисекунды у append(). Если вставлять в начало приходится часто, используйте collections.deque и его метод appendleft().

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

В конец списка добавляют через a.extend([x, y, z]) или a += [x, y, z]. В середину помогает срез: a[1:1] = [x, y] вставит оба значения перед элементом с индексом 1.

Почему после append в переменной оказался None?

Скорее всего, в коде есть строка a = a.append(x). Метод изменяет список и возвращает None, и это значение перезаписывает переменную. Уберите присваивание, и список останется списком.

Как добавить элемент в массив в Python?

Если «массивом» вы называете обычный список, подойдут append(), insert() и extend(). У массива NumPy метода append нет: функция np.append(arr, x) возвращает новый массив, и его нужно сохранить в переменную, исходный при этом не меняется.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!