В чем разница между 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 шт):
a.extend(a)
Это полностью эквивалентно коду:
for x in a.copy():
a.append(x)
И при этом совершенно не важно, что находится в a, главное чтобы по этому можно было проитерироваться, ну и чтобы a.append работало.
Update: Поставил a.copy(), extrn прав, вот не проверишь код - и окажется какая-нибудь засада.
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 нужно передавать итератор, который поэлементно добавится в список.
.append()принимает как аргумент 1 элемент, который добавится к списку,.extend()принимает как аргумент список, которого все элементы добавятся к списку.