append
: Hängt das Objekt am Ende an.
x = [1, 2, 3]
x.append([4, 5])
print (x)
gibt Ihnen: [1, 2, 3, [4, 5]]
extend
: Erweitert die Liste durch Anhängen von Elementen aus der Iterable.
x = [1, 2, 3]
x.extend([4, 5])
print (x)
gibt Ihnen: [1, 2, 3, 4, 5]
extend
und einfach mit dem Additionsoperator - im obigen Beispielx = x + [4, 5]
?x + [4, 5]
gibt Ihnen eine neue Liste, die x zugewiesen ist -x.extend()
mutiert die ursprüngliche Liste. Ich werde in meiner Antwort hier unten näher darauf eingehen.x += [4,5]
.append
ist Object . Wenn Sie versuchen,extend
ein Wörterbuch zu verwenden, und es übergeben , wird der Schlüssel und nicht der gesamte Hash an das Ende des Arrays angehängt.append
Fügt einer Liste ein Element hinzu undextend
verkettet die erste Liste mit einer anderen Liste (oder einer anderen iterierbaren, nicht unbedingt einer Liste).quelle
append
fügt sein Argument als einzelnes Element am Ende einer Liste hinzu. Die Länge der Liste selbst wird um eins erhöht.extend
iteriert über sein Argument und fügt jedes Element zur Liste hinzu, wodurch die Liste erweitert wird. Die Länge der Liste erhöht sich um die Anzahl der Elemente im iterierbaren Argument.append
Die
list.append
Methode hängt ein Objekt an das Ende der Liste an.Was auch immer das Objekt ist, ob eine Zahl, eine Zeichenfolge, eine andere Liste oder etwas anderes, es wird am Ende
my_list
als einzelner Eintrag in der Liste hinzugefügt .Denken Sie also daran, dass eine Liste ein Objekt ist. Wenn Sie eine andere Liste an eine Liste anhängen, ist die erste Liste ein einzelnes Objekt am Ende der Liste (was möglicherweise nicht Ihren Wünschen entspricht):
extend
Die
list.extend
Methode erweitert eine Liste durch Anhängen von Elementen aus einer iterierbaren Datei:Mit expand wird also jedes Element der Iterable an die Liste angehängt. Zum Beispiel:
Denken Sie daran, dass eine Zeichenfolge iterierbar ist. Wenn Sie also eine Liste mit einer Zeichenfolge erweitern, hängen Sie jedes Zeichen an, während Sie über die Zeichenfolge iterieren (was möglicherweise nicht das ist, was Sie möchten):
Bedienerüberlastung,
__add__
(+
) und__iadd__
(+=
)Sowohl
+
als auch+=
Operatoren sind für definiertlist
. Sie sind semantisch ähnlich zu erweitern.my_list + another_list
Erstellt eine dritte Liste im Speicher, sodass Sie das Ergebnis zurückgeben können. Die zweite iterierbare Liste muss jedoch eine Liste sein.my_list += another_list
Ändert die Liste an Ort und Stelle (es ist der Operator an Ort und Stelle, und Listen sind veränderbare Objekte, wie wir gesehen haben), sodass keine neue Liste erstellt wird. Es funktioniert auch wie Extend, da das zweite Iterable jede Art von Iterable sein kann.Seien Sie nicht verwirrt -
my_list = my_list + another_list
ist nicht gleichbedeutend mit+=
- es gibt Ihnen eine brandneue Liste, die my_list zugewiesen ist.Zeitliche Komplexität
Anhängen hat eine konstante zeitliche Komplexität , O (1).
Erweitern hat Zeitkomplexität, O (k).
Das Durchlaufen der mehreren Aufrufe erhöht
append
die Komplexität und entspricht damit der Erweiterung. Da die Iteration von extens in C implementiert ist, ist sie immer schneller, wenn Sie aufeinanderfolgende Elemente aus einer iterierbaren Datei an eine Liste anhängen möchten.Performance
Sie fragen sich vielleicht, was leistungsfähiger ist, da Anhängen verwendet werden kann, um das gleiche Ergebnis wie Erweitern zu erzielen. Die folgenden Funktionen machen dasselbe:
Also lasst uns sie zeitlich festlegen:
Adressierung eines Kommentars zu Timings
Ein Kommentator sagte:
Mach das semantisch Richtige. Wenn Sie alle Elemente in einer Iterable anhängen möchten, verwenden Sie
extend
. Wenn Sie nur ein Element hinzufügen, verwenden Sieappend
.Ok, also lassen Sie uns ein Experiment erstellen, um zu sehen, wie dies rechtzeitig funktioniert:
Und wir sehen, dass es eine (geringfügige) Zeitverschwendung ist, sich die Mühe zu machen, eine iterierbare Erweiterung zu erstellen, um sie nur zu verwenden:
Wir lernen daraus, dass die Verwendung nichts bringt,
extend
wenn wir nur ein Element anhängen müssen.Auch diese Timings sind nicht so wichtig. Ich zeige ihnen nur, um zu verdeutlichen, dass in Python das semantisch Richtige die Dinge auf die richtige Art und Weise tun .
Es ist denkbar, dass Sie Timings an zwei vergleichbaren Operationen testen und ein mehrdeutiges oder inverses Ergebnis erhalten. Konzentrieren Sie sich einfach darauf, das semantisch Richtige zu tun.
Fazit
Wir sehen , dass
extend
semantisch klarer, und dass es als viel schneller ausgeführt werden könnenappend
, wenn Sie beabsichtigen , jedes Element in einer iterable zu einer Liste anzuhängen.Wenn Sie nur ein einzelnes Element (nicht in einem iterierbaren Element) zur Liste hinzufügen möchten, verwenden Sie
append
.quelle
ex1 = 0
undex2 = [0]
) zu erstellen und diese Variablen zu übergeben, wenn Sie strenger sein möchten.l1 += l2
vsl1.extend(l2)
?l1 += l2
Undl1.extend(l2)
letztendlich den gleichen Code ausführen (dielist_extend
Funktion inlistobject.c
). Die einzigen Unterschiede sind: 1.+=
Neuzuweisungl1
(für sich selbstlist
, aber die Neuzuweisung unterstützt unveränderliche Typen, die danach nicht mehr dasselbe Objekt sind), was es illegal macht, wennl1
es sich tatsächlich um ein Attribut eines unveränderlichen Objekts handelt; zum Beispielt = ([],)
,t[0] += lst
würde scheitern, währendt[0].extend(lst)
funktionieren würde. 2.l1 += l2
verwendet dedizierte Bytecodes, währendl1.extend(l2)
der allgemeine Methodenversand verwendet wird; das macht+=
schneller alsextend
.+=
Neuzuweisungl1
erforderlich ist, bedeutet, dass in einigen Fällen der langsamere Versandextend
teilweise oder vollständig dadurch ausgeglichen wird, dass nicht auf der linken Seite zurück zugewiesen wird . Zum Beispiel, wenn daslist
ein Attribut eines Objekts istself.l1 += l2
undself.l1.extend(l2)
bei meiner Python 3.6-Installation die gleiche Leistung aufweist, einfach weil eine echte Operation eher so istself.l1 = self.l1.__iadd__(l2)
, was bedeutet, dass sie eine mäßig teure Leistung erbringen mussSTORE_ATTR
,self.l1.extend(l2)
die nicht erforderlich ist.+=
nur verwendet wirdSTORE_FAST
, was sehr billig ist), bei der der hinzugefügte Wert ein vorhandenerlist
mit einem Element ist, wobei die Operation 1000-mal wiederholt wurde,+=
dauerte die Operation durchschnittlich etwa 33 ns , währendextend
78 ns dauerte, eine Differenz von 45 ns. Wennl1
es sich um ein globales System handelt (das teurer istSTORE_GLOBAL
), verringert sich der Unterschied auf 17 ns. Wennl1
tatsächlichlocal.l1
(erfordert noch teurerSTORE_ATTR
), gibt es keinen bedeutenden Unterschied zwischen+=
undextend
(Timings ungefähr identisch;extend
manchmal gewinnt).append
fügt ein einzelnes Element hinzu.extend
Hängt eine Liste von Elementen an.Beachten Sie, dass beim Übergeben einer Liste zum Anhängen immer noch ein Element hinzugefügt wird:
quelle
Anhängen gegen Erweitern
Mit Anhängen können Sie ein einzelnes Element anhängen, das die Liste erweitert:
Wenn Sie mehr als ein Element erweitern möchten, sollten Sie verlängern verwenden, da Sie nur ein Element oder eine Liste von Elementen anhängen können:
Damit Sie eine verschachtelte Liste erhalten
Stattdessen können Sie mit verlängern ein einzelnes Element wie dieses erweitern
Oder, anders als beim Anhängen, erweitern Sie mehrere Elemente auf einmal, ohne die Liste in die ursprüngliche zu verschachteln (das ist der Grund für die Erweiterung des Namens).
Hinzufügen eines Elements mit beiden Methoden
Sowohl Anhängen als auch Erweitern können ein Element am Ende der Liste hinzufügen, obwohl das Anhängen einfacher ist.
1 Element anhängen
ein Element erweitern
Hinzufügen weiterer Elemente ... mit unterschiedlichen Ergebnissen
Wenn Sie append für mehr als ein Element verwenden, müssen Sie eine Liste von Elementen als Argumente übergeben, und Sie erhalten eine NESTED-Liste!
Mit verlängern übergeben Sie stattdessen eine Liste als Argument, erhalten jedoch eine Liste mit dem neuen Element, das nicht im alten verschachtelt ist.
Mit mehr Elementen verwenden Sie "Erweitern", um eine Liste mit mehr Elementen zu erhalten. Durch das Anhängen einer Liste werden jedoch keine weiteren Elemente zur Liste hinzugefügt, sondern ein Element, das eine verschachtelte Liste ist, wie Sie in der Ausgabe des Codes deutlich sehen können.
quelle
Die folgenden zwei Schnipsel sind semantisch äquivalent:
und
Letzteres kann schneller sein, wenn die Schleife in C implementiert ist.
quelle
extend()
wahrscheinlich vorbelegt,append()
wahrscheinlich nicht.extend()
eine sinnlose Vorbelegung nicht möglich ist, da einige Iterables nicht implementiert werden__len__()
, aber wie Sie wäre ich überrascht, wenn es nicht versucht wird. Ein Teil des Leistungsgewinns resultiert auch aus dem Iterationsteil in reinem C anstelle von Python, wie in Aarons Antwort ausgeführt .Die
append()
Methode fügt am Ende der Liste ein einzelnes Element hinzu.Die
extend()
Methode verwendet ein Argument, eine Liste, und hängt jedes Element des Arguments an die ursprüngliche Liste an. (Listen werden als Klassen implementiert. Durch das „Erstellen“ einer Liste wird eine Klasse wirklich instanziiert. Daher verfügt eine Liste über Methoden, die darauf angewendet werden.)Vom Tauchen in Python .
quelle
extend
als Liste mit einem Element übergeben haben['abc']
: [1, 2, 3, 4, 5, 'abc']. Ändern Sie die abc-Zeile in :x.extend('abc')
. Und entfernen Sie dasx.extend(6)
oder ändern Sie es inx.extend([6])
.Sie können "+" verwenden, um "verlängern" zurückzugeben, anstatt an Ort und Stelle zu verlängern.
Ähnliches gilt
+=
für das Verhalten an Ort und Stelle, jedoch mit geringfügigen Abweichungen vonappend
&extend
. Einer der größten Unterschiede von+=
ausappend
undextend
ist , wenn es in Funktion Bereichen verwendet wird, finden Sie diese Blog - Post .quelle
append(object)
- Aktualisiert die Liste, indem der Liste ein Objekt hinzugefügt wird.extend(list)
- Verkettet im Wesentlichen zwei Listen.quelle
extend()
kann mit einem Iteratorargument verwendet werden. Hier ist ein Beispiel. Sie möchten eine Liste aus einer Liste von Listen auf folgende Weise erstellen:Von
Sie wollen
Sie können dies verwenden
itertools.chain.from_iterable()
. Die Ausgabe dieser Methode ist ein Iterator. Seine Umsetzung entsprichtZurück zu unserem Beispiel können wir tun
und holen Sie sich die Fahndungsliste.
So
extend()
kann ein Iterator-Argument gleichwertig verwendet werden:quelle
Dies entspricht dem Operator
append
und dessenextend
Verwendung+
:quelle
append () : In Python wird grundsätzlich ein Element hinzugefügt.
verlängern () : Wobei verlängern () verwendet wird, um zwei Listen zusammenzuführen oder mehrere Elemente in eine Liste einzufügen.
quelle
Ein interessanter Punkt, der angedeutet, aber nicht erklärt wurde, ist, dass das Erweitern schneller ist als das Anhängen. Für jede Schleife, in der Anhänge enthalten sind, sollte davon ausgegangen werden, dass sie durch list.extend (process_elements) ersetzt wird.
Beachten Sie, dass das Zulassen neuer Elemente dazu führen kann, dass die gesamte Liste an einen besseren Speicherort verschoben wird. Wenn dies mehrmals durchgeführt wird, weil jeweils 1 Element angehängt wird, leidet die Gesamtleistung. In diesem Sinne ist list.extend analog zu "" .join (stringlist).
quelle
Anhängen fügt die gesamten Daten auf einmal hinzu. Die gesamten Daten werden dem neu erstellten Index hinzugefügt. Auf der anderen Seite wird
extend
, wie der Name schon sagt, das aktuelle Array erweitert.Zum Beispiel
Mit
append
bekommen wir:Währenddessen erhalten
extend
wir:quelle
Ein englisches Wörterbuch definiert die Wörter
append
undextend
als:anhängen : am Ende eines schriftlichen Dokuments (etwas) hinzufügen.
verlängern : größer machen. Vergrößern oder erweitern
Mit diesem Wissen wollen wir jetzt verstehen
1) Der Unterschied zwischen
append
undextend
append
::extend
::list(iterable)
.2) Ähnlichkeit zwischen
append
undextend
None
.Beispiel
quelle
Ich hoffe, ich kann diese Frage sinnvoll ergänzen. Wenn Ihre Liste beispielsweise ein bestimmtes Typobjekt speichert
Info
, ist dieseextend
Methode in einer Situation nicht geeignet: In einerfor
Schleife undInfo
jedes Mal, wenn ein Objekt generiert undextend
zum Speichern in Ihrer Liste verwendet wird, schlägt dies fehl. Die Ausnahme ist wie folgt:Wenn Sie jedoch die
append
Methode verwenden, ist das Ergebnis in Ordnung. Da dieextend
Methode jedes Mal verwendet wird, wird sie immer als Liste oder ein anderer Auflistungstyp behandelt, iteriert und nach der vorherigen Liste platziert. Ein bestimmtes Objekt kann natürlich nicht iteriert werden.quelle
Um sie intuitiv zu unterscheiden
Es ist, als würde man
l1
einen Körper in ihrem Körper reproduzieren (verschachtelt).Es ist so, dass zwei getrennte Personen heiraten und eine vereinte Familie bilden.
Außerdem erstelle ich ein ausführliches Cheatsheet aller Methoden der Liste als Referenz.
quelle
extend(L)
Erweitert die Liste, indem alle Elemente in der angegebenen Liste angehängt werdenL
.quelle
append
"erweitert" die Liste (an Ort und Stelle) um nur ein Element , das einzelne übergebene Objekt (als Argument).extend
"erweitert" die Liste (an Ort und Stelle) um so viele Elemente, wie das übergebene Objekt (als Argument) enthält.Dies kann für
str
Objekte etwas verwirrend sein .append
am Ende ein einzelnes Zeichenfolgenelement hinzu,extend
fügt jedoch so viele "einzelne" "str" -Elemente wie die Länge dieser Zeichenfolge hinzu.append
am Ende immer noch ein einzelnes Listenelement hinzu undextend
fügt so viele Listenelemente hinzu, wie die Länge der übergebenen Liste beträgt.produziert:
quelle
Anhängen und Erweitern sind einer der Erweiterungsmechanismen in Python.
Anhängen: Fügt am Ende der Liste ein Element hinzu.
Um der Liste ein neues Element hinzuzufügen, können Sie die Append-Methode folgendermaßen verwenden.
Die Standardposition, an der das neue Element hinzugefügt wird, befindet sich immer an der Position (Länge + 1).
Einfügen: Die Einfügemethode wurde verwendet, um die Einschränkungen des Anhängens zu überwinden. Mit Einfügen können wir explizit die genaue Position definieren, an der unser neues Element eingefügt werden soll.
Methodendeskriptor der Einfügung (Index, Objekt). Es werden zwei Argumente benötigt: erstens der Index, in den wir unser Element einfügen möchten, und zweitens das Element selbst.
Erweitern: Dies ist sehr nützlich, wenn zwei oder mehr Listen zu einer einzigen Liste zusammengefasst werden sollen. Wenn wir zwei Listen verbinden möchten, enthält das resultierende Objekt ohne Erweiterung eine Liste von Listen.
Wenn wir versuchen, auf das Element in Position 2 zuzugreifen, erhalten wir anstelle des Elements eine Liste ([3]). Um zwei Listen zu verbinden, müssen wir append verwenden.
Mehrere Listen verbinden
quelle