В чем разница между:
some_list1 = []
some_list1.append("something")
и
some_list2 = []
some_list2 += ["something"]
В чем разница между:
some_list1 = []
some_list1.append("something")
и
some_list2 = []
some_list2 += ["something"]
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Ответы:
Для вашего случая единственная разница - это производительность: добавление в два раза быстрее.
В общем случае
append
добавит один элемент в список, а все элементы правого списка+=
скопирует в левый.Обновление: анализ производительности
Сравнивая байт-коды, можно предположить, что
append
версия тратит циклы вLOAD_ATTR
+CALL_FUNCTION
, а + = версия - вBUILD_LIST
. ВидимоBUILD_LIST
перевешиваетLOAD_ATTR
+CALL_FUNCTION
.Мы можем еще больше повысить производительность, удалив
LOAD_ATTR
накладные расходы:источник
append
vs+=
, вы должны включить создание списка как часть измерения. Иначе был бы другой вопрос (extend
vs+=
).В приведенном вами примере нет разницы с точки зрения вывода между
append
и+=
. Но есть разница междуappend
и+
(о которой изначально задавался вопрос).Как видите,
append
и+=
результат тот же; они добавляют элемент в список, не создавая новый список. Использование+
добавляет два списка и создает новый список.источник
append
добавляет одну запись в список, а + = добавляет столько, сколько есть в другом списке (т.е. псевдонимыextend
). Но он это уже знает, судя по тому, как был написан вопрос. Есть ли еще какая-то разница, которую мне не хватает?Обратите внимание, что append добавляет в список один элемент, которым может быть что угодно.
+=[]
присоединяется к спискам.источник
+ = - присвоение. Когда вы его используете, вы на самом деле говорите «some_list2 = some_list2 + ['something']». Назначения включают повторную привязку, поэтому:
Оператор + = также обычно должен создавать новый объект списка, как обычно делает list + list:
Однако на самом деле:
Это связано с тем, что списки Python реализуют __iadd __ () для короткого замыкания + = augmented assignment и вместо этого вызывают list.extend (). (Это немного странная бородавка: обычно она делает то, что вы имели в виду, но по непонятным причинам.)
В общем, если вы добавляете / расширяете существующий список и хотите сохранить ссылку на тот же список (вместо создания нового), лучше всего быть явным и придерживаться append () / extend () методы.
источник
на самом деле
для одного значения разницы нет. В документации указано, что:
Таким образом, очевидно,
s.append(x)
это то же самое, что иs.extend([x])
источник
Разница в том, что объединение приведет к сглаживанию результирующего списка, а добавление сохранит уровни без изменений:
Так, например, с:
Используя append, вы получаете список списков:
Вместо этого, используя конкатенацию, вы получите плоский список:
источник
Тесты производительности здесь неверны:
например
хорошие тесты можно найти здесь: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
источник
+= [one_var]
. Если мы опускаем создание списков, + = становится самым быстрым вариантом.В дополнение к аспектам, описанным в других ответах, append и + [] имеют совсем другое поведение, когда вы пытаетесь создать список списков.
list1 + ['5', '6'] добавляет '5' и '6' к list1 как отдельные элементы. list1.append (['5', '6']) добавляет список ['5', '6'] в список list1 как один элемент.
источник
Поведение повторной привязки, упомянутое в других ответах, имеет значение при определенных обстоятельствах:
Это потому, что расширенное присваивание всегда выполняет повторную привязку, даже если объект был изменен на месте. Здесь происходит повторная привязка
a[1] = *mutated list*
, которая не работает для кортежей.источник
давайте сначала возьмем пример
источник
Метод append () добавляет один элемент в существующий список
Итак, здесь some_list1 будет изменен.
Обновлено:
В то время как использование + для объединения элементов списков (более одного элемента) в существующем списке аналогично расширению (исправлено Flux ).
Итак, здесь some_list2 и ["something"] - это два объединенных списка.
источник
+=
не возвращает новый список. В FAQ по программированию говорится: «... для списков__iadd__
это эквивалентно вызовуextend
списка и возврату списка. Вот почему мы говорим, что для списков+=
это« сокращение »дляlist.extend
». Вы также можете убедиться в этом сами в исходном коде CPython: github.com/python/cpython/blob/v3.8.2/Objects/…"+" не изменяет список
.append () мутирует старый список
источник