В чем разница между extend и append?

Я немного не понимаю в чем разница между append и extend в структурах данных, на конкретной ситуации.

a = [1]
a.append(a)
print(a)
#[1, [...]]

но

a = [1]
a.extend(a)
print(a)
#[1, 1]

но

a = 1,
a += a
print(a)
#(1, 1)

Как я понимаю в первом случае я создаю список, в него засовываю его же, но так как он уже изменился, и айди осталось то же, то ему придется себя еще раз изменить рекурсивно и так далее. В третьем мы изменяем кортеж, но изменяем его айди и соответсвенно, тот кортеж уже не тот, что после. Но что во втором не так?


Ответы (4 шт):

Автор решения: CrazyElf
a.extend(a)

Это полностью эквивалентно коду:

for x in a.copy():
    a.append(x)

И при этом совершенно не важно, что находится в a, главное чтобы по этому можно было проитерироваться, ну и чтобы a.append работало.

Update: Поставил a.copy(), extrn прав, вот не проверишь код - и окажется какая-нибудь засада.

→ Ссылка
Автор решения: ganz

append добавляет объект, extend расширяет, то есть extend аналогичен append за исключением того что параметром может служить лишь итерируемый объект, который распаковывается

x=[1]
x.append([2])
#[1,[2]]
x.extend([3])
#[1,[2],3]
xx=[4,5]
x.extend(xx)
#[1,[2],3,4,5]
x.append(xx)
#[1,[2],3,4,5,[4,5]]
x.extend(*[xx])
#[1,[2],3,4,5,[4,5],4,5]
[].extend(*[xx])==[].append(xx) #unpack then append
#True
→ Ссылка
Автор решения: Олег Плюснин

a.append(x) тупо берет элемент x как есть и добавляет его в список a. x может быть что угодно, оно просто добавится в список. Если x список, то в a добавится один элемент - список x. А в extend нужно передавать итератор, который поэлементно добавится в список.

→ Ссылка
Автор решения: MarianD
  • .append() принимает как аргумент 1 элемент, который добавится к списку,
  • .extend() принимает как аргумент список, которого все элементы добавятся к списку.
→ Ссылка