append и extend в Python — два метода списка, которые часто путают. Разница простая: append добавляет переданный объект как один элемент, а extend распаковывает его и добавляет каждый элемент по отдельности. Из-за этого одинаковый на вид код даёт разный результат. Разберём на примерах.
Коротко
list.append(x) кладёт x в конец списка как единый элемент — если x список, получится вложенный список. list.extend(x) перебирает x и добавляет его элементы поштучно. Нужно вложить объект целиком — append; влить элементы другого списка — extend.
a = [1, 2]
a.append([3, 4])
print(a)
b = [1, 2]
b.extend([3, 4])
print(b)[1, 2, [3, 4]] [1, 2, 3, 4]
append([3, 4]) добавил весь список [3, 4] как один элемент — получился вложенный список. extend([3, 4]) распаковал его и добавил 3 и 4 по отдельности. Код почти одинаковый, а результат принципиально разный.
.append([4, 5]) — добавляет список как один элемент
numbers = [1, 2, 3]
numbers.append([4, 5])
print(numbers) # [1, 2, 3, [4, 5]]Метод .append() кладёт переданный список целиком, одним вложенным элементом. В списке становится 4 элемента: последний — это вложенный список [4, 5].
.extend([4, 5]) — добавляет элементы по отдельности
numbers = [1, 2, 3]
numbers.extend([4, 5])
print(numbers) # [1, 2, 3, 4, 5]Метод .extend() разбирает переданный список и добавляет каждый его элемент по отдельности. В списке становится 5 элементов.
Ловушка: extend со строкой
Строка в Python — это тоже последовательность (из символов). Поэтому extend со строкой распакует её по буквам, что чаще всего не то, чего ожидаешь.
tags = ["python"]
tags.extend("go")
print(tags)['python', 'g', 'o']
extend("go") добавил не слово, а два символа — 'g' и 'o'. Чтобы добавить строку целиком, нужен append("go"). Про списки, их методы и хранение элементов — в гайде Списки в Python: создание, методы и срезы.
Когда что использовать
| Ситуация | Метод | Результат для [1, 2] |
|---|---|---|
| Добавить один объект (число, строку, список целиком) | append(x) | append([3,4]) → [1, 2, [3, 4]] |
| Влить элементы другой коллекции | extend(x) | extend([3,4]) → [1, 2, 3, 4] |
Оба метода меняют список на месте и возвращают None — присваивать a = a.append(x) не нужно, иначе потеряешь список. Почему методы возвращают None, а не изменённый объект — это про изменяемые типы, разобрано в гайде Типы данных в Python: полный гайд для начинающих.
Короткие ответы на вопросы
В чём главная разница append и extend?
append добавляет аргумент как один элемент, extend — распаковывает его и добавляет элементы по отдельности. append([3,4]) даёт вложенный список, extend([3,4]) — плоский.
Как добавить один список внутрь другого целиком?
Через append: a.append([3, 4]) вложит список [3, 4] как единый элемент. extend в этом случае «разольёт» его элементы.
Почему extend со строкой добавляет буквы?
Потому что строка — это последовательность символов, а extend перебирает переданную последовательность. Чтобы добавить строку целиком, используй append.
Кот-наставник— Простое правило:
append— «положи целиком»,extend— «высыпи содержимое».append([3,4])даёт вложенный список,extend([3,4])— плоский.— И помни про строку:
extend("go")добавит буквы, а не слово. Нужно слово — бериappend.
Методы списков запоминаются на практике
На SkillPy ты работаешь со списками сам, а AI-наставник показывает, где append вложил объект, а где extend разлил элементы, — до того, как это станет багом. Он понимает твой код, а не сверяет с шаблоном.
