Was ist der Unterschied zwischen:
some_list1 = []
some_list1.append("something")
und
some_list2 = []
some_list2 += ["something"]
Was ist der Unterschied zwischen:
some_list1 = []
some_list1.append("something")
und
some_list2 = []
some_list2 += ["something"]
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Antworten:
In Ihrem Fall ist der einzige Unterschied die Leistung: Das Anhängen ist doppelt so schnell.
Im Allgemeinen
append
wird der Liste ein Element hinzugefügt, während alle Elemente der Liste auf der rechten Seite in die Liste auf der linken Seite+=
kopiert werden .Update: Perf-Analyse
Beim Vergleich von Bytecodes können wir davon ausgehen, dass die
append
Version Zyklen inLOAD_ATTR
+CALL_FUNCTION
und + = version - in verschwendetBUILD_LIST
. AnscheinendBUILD_LIST
überwiegtLOAD_ATTR
+CALL_FUNCTION
.Wir können die Leistung noch weiter verbessern, indem wir den
LOAD_ATTR
Overhead entfernen :quelle
append
vs vergleichen+=
, müssen Sie die Erstellung der Liste als Teil der Messung einbeziehen . Sonst wäre es eine andere Frage (extend
vs+=
).In dem von Ihnen angegebenen Beispiel gibt es keinen Unterschied in Bezug auf die Ausgabe zwischen
append
und+=
. Aber es gibt einen Unterschied zwischenappend
und+
(worüber die Frage ursprünglich gestellt wurde).Wie Sie sehen können
append
und+=
das gleiche Ergebnis haben; Sie fügen das Element der Liste hinzu, ohne eine neue Liste zu erstellen. Mit+
fügt werden die beiden Listen hinzugefügt und eine neue Liste erstellt.quelle
append
ein Eintrag zur Liste hinzugefügt wird, während + = so viele hinzufügt, wie in der anderen Liste vorhanden sind (dh Aliase zuextend
). Aber er / sie weiß das schon, gemessen an der Art und Weise, wie die Frage geschrieben wurde. Gibt es einen anderen Unterschied, den ich vermisse?Sehen Sie, dass das Anhängen der Liste ein einzelnes Element hinzufügt, das alles sein kann.
+=[]
schließt sich den Listen an.quelle
+ = ist eine Aufgabe. Wenn Sie es verwenden, sagen Sie wirklich 'some_list2 = some_list2 + [' etwas ']'. Zuweisungen beinhalten das erneute Binden, also:
Der Operator + = sollte normalerweise auch ein neues Listenobjekt erstellen, wie es list + list normalerweise tut:
In Wirklichkeit jedoch:
Dies liegt daran, dass Python-Listen __iadd __ () implementieren , um einen + = erweiterten Zuweisungskurzschluss zu erstellen und stattdessen list.extend () aufzurufen. (Es ist ein bisschen eine seltsame Warze: Sie macht normalerweise das, was Sie gemeint haben, aber aus verwirrenden Gründen.)
Wenn Sie eine vorhandene Liste anhängen / erweitern und den Verweis auf dieselbe Liste beibehalten möchten (anstatt eine neue zu erstellen), ist es im Allgemeinen am besten, explizit zu sein und bei append () / extens () zu bleiben. Methoden.
quelle
ist eigentlich
Für einen Wert gibt es keinen Unterschied. In der Dokumentation heißt es:
Somit ist offensichtlich
s.append(x)
dasselbe wies.extend([x])
quelle
Der Unterschied besteht darin, dass durch Verketten die resultierende Liste reduziert wird , während durch Anhängen die Ebenen intakt bleiben:
So zum Beispiel mit:
Wenn Sie Anhängen verwenden, erhalten Sie eine Liste mit Listen:
Wenn Sie stattdessen verketten verwenden, erhalten Sie eine flache Liste:
quelle
Die Leistungstests hier sind nicht korrekt:
z.B
Gute Tests finden Sie hier: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
quelle
+= [one_var]
. Wenn wir das Erstellen von Listen weglassen, wird + = die schnellste Option.Zusätzlich zu den in den anderen Antworten beschriebenen Aspekten verhalten sich Anhängen und + [] sehr unterschiedlich, wenn Sie versuchen, eine Liste von Listen zu erstellen.
list1 + ['5', '6'] fügt der Liste1 '5' und '6' als einzelne Elemente hinzu. list1.append (['5', '6']) fügt die Liste ['5', '6'] als einzelnes Element zur Liste1 hinzu.
quelle
Das in anderen Antworten erwähnte Rückbindungsverhalten spielt unter bestimmten Umständen eine Rolle:
Dies liegt daran, dass die erweiterte Zuweisung immer wieder neu bindet, selbst wenn das Objekt an Ort und Stelle mutiert wurde. Das erneute Binden hier ist zufällig
a[1] = *mutated list*
, was bei Tupeln nicht funktioniert.quelle
Nehmen wir zuerst ein Beispiel
quelle
Die Methode append () fügt der vorhandenen Liste ein einzelnes Element hinzu
Hier wird also some_list1 geändert.
Aktualisiert:
Verwenden Sie +, um die Elemente von Listen (mehr als ein Element) in der vorhandenen Liste zu kombinieren, ähnlich der Erweiterung (wie von Flux korrigiert ).
Hier sind also some_list2 und ["etwas"] die beiden Listen, die kombiniert werden.
quelle
+=
gibt keine neue Liste zurück. In den häufig gestellten Fragen zur Programmierung heißt es: "... für Listen__iadd__
entspricht dem Aufrufenextend
der Liste und dem Zurückgeben der Liste. Deshalb sagen wir, dass für Listen+=
eine" Abkürzung "fürlist.extend
" ist. Sie können dies auch im CPython-Quellcode selbst sehen: github.com/python/cpython/blob/v3.8.2/Objects/…„+“ Nicht mutiert die Liste
.append () mutiert die alte Liste
quelle