Frage Python append () vs. + Operator auf Listen, warum ergeben diese unterschiedliche Ergebnisse?


Warum tun diese beiden Operationen (append() bzw. +) geben unterschiedliche Ergebnisse?

>>> 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 gleich. Warum ist das anders bei der + Betrieb?


76
2018-01-07 16:56


Ursprung


Antworten:


Um zu erklären, "warum":

Das + Betrieb fügt das hinzu Array Elemente zum ursprünglichen Array. Das array.append Operation fügt das Array (oder ein beliebiges Objekt) in das Ende des ursprünglichen Arrays ein, was zu a führt Bezug auf sich selbst an dieser Stelle (daher die unendliche Rekursion).

Der Unterschied hierbei ist, dass die Operation + spezifisch wirkt, wenn Sie ein Array hinzufügen (es ist wie andere überladen, siehe) dieses Kapitel auf Sequenzen) durch Verketten des Elements. Die append-Methode macht jedoch buchstäblich das, was Sie fragen: 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

Benutzen extend() wenn Sie eine Funktion verwenden möchten, die sich ähnlich wie der + Operator verhält (wie auch andere hier gezeigt haben). Es ist nicht ratsam, das Gegenteil zu tun: zu versuchen, append mit dem Operator + für Listen nachzuahmen (siehe meine früherer Link Warum?

Kleine Geschichte

Zum Spaß, ein wenig Geschichte: die Geburt des Array-Moduls in Python im Februar 1993. Es könnte Sie überraschen, aber Arrays wurden hinzugefügt, nachdem Sequenzen und Listen entstanden.


111
2018-01-07 16:58



append hängt ein Element an eine Liste an. Wenn Sie die Liste mit der neuen Liste erweitern möchten, müssen Sie sie verwenden extend.

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

15
2018-01-07 16:59



Der Verkettungsoperator + ist ein binärer Infix-Operator, der, wenn er auf Listen angewendet wird, eine neue Liste zurückgibt, die alle Elemente jedes seiner Operanden enthält. Das list.append() Methode ist a mutator auf list welches seine Single anfügt object Argument (in Ihrem konkreten Beispiel die Liste c) zum Thema list. In Ihrem Beispiel führt dies zu c Anhängen eines Verweises auf sich selbst (daher die unendliche Rekursion).

Eine Alternative zur "+" Verkettung

Das list.extend() Methode ist auch eine Mutator-Methode, die es verkettet sequence Auseinandersetzung mit dem Thema list. Insbesondere hängt es jedes der Elemente von an sequence in Iterationsreihenfolge.

Ein beiseite

Als Betreiber + gibt das Ergebnis des Ausdrucks als neuen Wert zurück. Nicht verkettet sein mutator Methode, list.extend() Ändert die Objektliste direkt und gibt nichts zurück.

Arrays

Ich habe dies aufgrund der möglichen Verwirrung hinzugefügt, die die obige Abel-Antwort durch Mischen der Diskussion von Listen, Sequenzen und Arrays verursachen könnte. Arrays wurden nach Sequenzen und Listen zu Python hinzugefügt, um Arrays mit ganzzahligen Datentypen effizienter zu speichern. Nicht verwechseln arrays mit lists. Sie sind nicht gleich.

Von dem Array-Dokumente: 

Arrays sind Sequenztypen und verhalten sich sehr ähnlich wie Listen, nur dass der Typ der darin gespeicherten Objekte eingeschränkt ist. Der Typ wird zum Zeitpunkt der Objekterstellung angegeben, indem ein Typcode verwendet wird, bei dem es sich um ein einzelnes Zeichen handelt.


12
2017-07-03 03:35



Python-Listen sind heterogen, dh die Elemente in derselben Liste können alle Arten von Objekten sein. Der Ausdruck: c.append(c) hängt das Objekt an c Was auch immer es für die Liste sein mag. In dem Fall macht es die Liste selbst zu einem Mitglied der Liste.

Der Ausdruck c += c fügt zwei Listen zusammen und ordnet das Ergebnis der Variablen zu c. Das überladene + Operator ist 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 wirklich nur verschiedene Ausdrücke, die verwendet werden, um unterschiedliche Dinge zu tun.


8
2018-01-07 17:00



Die Methode, die Sie suchen, ist extend(). Aus dem Python Dokumentation:

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).

6
2018-01-07 17:03



Sie sollten extend () verwenden

>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

andere Information: Append vs. Extend


2
2018-01-07 17:02



Sehen die Dokumentation:

list.append (x)

  • Fügen Sie ein Element am Ende der Liste hinzu. äquivalent zu [len (a):] = [x].

Liste.Extend (L)    - Erweitern Sie die Liste, indem Sie alle Elemente in der angegebenen Liste hinzufügen;   äquivalent zu [len (a):] = L.

c.append(c) "hängt" c an sich selbst an als ein Element. Da eine Liste ein Referenztyp ist, wird eine rekursive Datenstruktur erstellt.

c += c ist äquivalent zu extend(c), die anfügt die Elemente von c bis c.


2
2018-01-07 17:10