Warum führen diese beiden Operationen ( append()
bzw. +
) zu unterschiedlichen Ergebnissen?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
Im letzten Fall gibt es tatsächlich eine unendliche Rekursion. c[-1]
und c
sind die gleichen. Warum ist es bei der +
Operation anders ?
python
list
append
nested-lists
ooboo
quelle
quelle
+=
: stackoverflow.com/questions/725782/…Antworten:
Um das "Warum" zu erklären:
Die
+
Operation fügt die Array- Elemente dem ursprünglichen Array hinzu. Diearray.append
Operation fügt das Array (oder ein beliebiges Objekt) in das Ende des ursprünglichen Arrays ein, was zu einem Verweis auf sich selbst an dieser Stelle führt (daher die unendliche Rekursion).Der Unterschied besteht darin, dass die + -Operation spezifisch wirkt, wenn Sie ein Array hinzufügen (es ist wie andere überladen, siehe dieses Kapitel über Sequenzen), indem Sie das Element verketten. Die Append-Methode macht jedoch buchstäblich das, was Sie verlangen: Hängen Sie das Objekt auf der rechten Seite an, die Sie ihm geben (das Array oder ein anderes Objekt), anstatt seine Elemente zu übernehmen.
Eine Alternative
Verwenden
extend()
Sie diese Option, wenn Sie eine Funktion verwenden möchten, die dem Operator + ähnelt (wie auch andere hier gezeigt haben). Es ist nicht ratsam, das Gegenteil zu tun: zu versuchen, das Anhängen mit dem Operator + für Listen nachzuahmen (siehe meinen früheren Link zum Warum).Wenig Geschichte
Zum Spaß ein wenig Geschichte: Die Geburt des Array-Moduls in Python im Februar 1993. Es mag Sie überraschen, aber Arrays wurden hinzugefügt, nachdem Sequenzen und Listen entstanden waren.
quelle
+
, symmetrisch zu sein: Liste mit Liste verketten.Der Verkettungsoperator
+
ist ein binärer Infix-Operator, der bei Anwendung auf Listen eine neue Liste zurückgibt, die alle Elemente jedes seiner beiden Operanden enthält. Dielist.append()
Methode ist eine Methode,mutator
anlist
die das einzelneobject
Argument (in Ihrem speziellen Beispiel die Listec
) an den Betreff angehängt wirdlist
. In Ihrem Beispiel führt dies dazuc
, dass ein Verweis auf sich selbst angehängt wird (daher die unendliche Rekursion).Eine Alternative zur Verkettung '+'
Die
list.extend()
Methode ist auch eine Mutator-Methode, die ihresequence
Argumentation mit dem Subjekt verknüpftlist
. Insbesondere werden alle Elementesequence
in Iterationsreihenfolge angehängt .Eine beiseite
Gibt als Operator
+
das Ergebnis des Ausdrucks als neuen Wert zurück. Da es sich um eine nicht verkettetemutator
Methode handelt, wird dielist.extend()
Themenliste direkt geändert und es wird nichts zurückgegeben.Arrays
Ich habe dies aufgrund der möglichen Verwirrung hinzugefügt, die die obige Antwort von Abel durch das Mischen der Diskussion von Listen, Sequenzen und Arrays verursachen kann.
Arrays
wurden Python nach Sequenzen und Listen hinzugefügt, um Arrays integraler Datentypen effizienter zu speichern. Nicht verwechselnarrays
mitlists
. Sie sind nicht gleich.Aus den Array-Dokumenten :
Arrays sind Sequenztypen und verhalten sich sehr ähnlich wie Listen, mit der Ausnahme, dass der Typ der darin gespeicherten Objekte eingeschränkt ist. Der Typ wird zum Zeitpunkt der Objekterstellung mithilfe eines Typcodes angegeben, der aus einem einzelnen Zeichen besteht.
quelle
append
hängt ein Element an eine Liste an. Wenn Sie die Liste um die neue Liste erweitern möchten, müssen Sie sie verwendenextend
.quelle
+
undextend
unterschiedliche Ergebnisse hervorbringen würden, hätten wir etwas zu überlegen.append
und+
anders sind. Deshalb. Ich mag diese Antwort, weil Angebote, was zu tun ist, sinnvoller sind.__lt__
es in Python nicht überladen werden konnte (heutzutage kann es). Warum-Fragen sind die wichtigsten, aber oft die schwierigsten zu beantworten: Sie fragen nach der Essenz, nicht nach einem Hinweis auf das Handbuch. Und natürlich: Wenn du eine Frage nicht magst (ich mag die meisten nicht), dann antworte nicht ;-)c += [c]
undc.append(c[:])
.a+b != a*b
? Das sind verschiedene Operationen. Das ist die Antwort. "Warum" ist nicht so hilfreich wie andere Fragen wie "Wie kann ich richtig anhängen?" Oder "Was ist los mit diesem Anhang, der zu einer unendlichen Rekursion führt?" Fragen der Form "Was mache ich mit X" oder "Was ist schief gelaufen, als ich X gemacht habe"? Oder "Was soll ich anstelle von X tun?" Hilft auch jemandem beim Lernen, liefert jedoch fokussierte, verwendbare und umsetzbare Antworten.Python-Listen sind heterogen, dh die Elemente in derselben Liste können beliebige Objekttypen sein. Der Ausdruck:
c.append(c)
Hängt das Objektc
an die Liste an. In diesem Fall wird die Liste selbst zu einem Mitglied der Liste.Der Ausdruck
c += c
addiert zwei Listen und weist der Variablen das Ergebnis zuc
. Der überladene+
Operator wird in Listen definiert, um eine neue Liste zu erstellen, deren Inhalt die Elemente in der ersten Liste und die Elemente in der zweiten Liste sind.Das sind also wirklich nur verschiedene Ausdrücke, die verwendet werden, um verschiedene Dinge mit Absicht zu tun.
quelle
Die Methode, die Sie suchen, ist
extend()
. Aus der Python- Dokumentation :quelle
Sie sollten verlängern ()
andere Infos: Anhängen vs. Erweitern
quelle
Siehe die Dokumentation :
c.append(c)
"fügt" c als Element an sich selbst an . Da eine Liste ein Referenztyp ist, wird eine rekursive Datenstruktur erstellt.c += c
ist äquivalent zuextend(c)
, wodurch die Elemente von c an c angehängt werden .quelle