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

Шесть инструментов отличаются тем, куда попадает новое значение и меняется ли исходный список.
| Задача | Способ | Куда добавляет | Исходный список |
|---|---|---|---|
| Один элемент в конец | 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]
Приём выглядит менее наглядно, чем методы, поэтому подпишите такую строку комментарием.
Скорость: почему 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-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 161 200 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




