Dlaczego te dwie operacje ( append()
odpowiednio +
) dają różne wyniki?
>>> 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, [...]]
>>>
W tym ostatnim przypadku rekurencja jest nieskończona. c[-1]
i c
są takie same. Dlaczego jest inaczej w przypadku +
operacji?
python
list
append
nested-lists
ooboo
źródło
źródło
+=
: stackoverflow.com/questions/725782/…Odpowiedzi:
Aby wyjaśnić „dlaczego”:
+
Operacja dodaje tablicy elementy do oryginalnej tablicy.array.append
Działanie wprowadza tablicę (lub dowolnego obiektu) do zakończenia początkowego tablicy, co daje w rezultacie w odniesieniu do siebie w tym miejscu (stąd nieskończonej rekurencji).Różnica polega na tym, że operacja + działa specyficznie, gdy dodajesz tablicę (jest przeciążona jak inne, zobacz ten rozdział o sekwencjach) przez konkatenację elementu. Jednak metoda append robi dosłownie to, o co prosisz: dołącza obiekt po prawej stronie, który mu dajesz (tablicę lub inny obiekt), zamiast pobierać jego elementy.
Alternatywa
Użyj,
extend()
jeśli chcesz użyć funkcji, która działa podobnie do operatora + (jak pokazały tu również inne osoby). Nie jest mądrze robić coś odwrotnego: próbować naśladować dopisywanie za pomocą operatora + dla list (zobacz mój wcześniejszy link o tym, dlaczego).Mała historia
Dla zabawy, trochę historii: narodziny modułu tablicy w Pythonie w lutym 1993 roku. Może cię to zaskoczyć, ale tablice zostały dodane długo po tym, jak powstały sekwencje i listy.
źródło
+
symetrii: łączenie listy z listą.Operator konkatenacji
+
jest binarnym operatorem wrostkowym, który po zastosowaniu do list zwraca nową listę zawierającą wszystkie elementy każdego z dwóch operandów.list.append()
Metoda jestmutator
nalist
którego dołącza swój jedenobject
argument (w przykładzie konkretnego wykazc
) do przedmiotulist
. W twoim przykładzie skutkuje toc
dołączeniem odwołania do samego siebie (stąd nieskończona rekurencja).Alternatywa dla konkatenacji „+”
list.extend()
Sposób jest również sposób mutator który skleja jejsequence
argumentu z przedmiotemlist
. W szczególności dołącza każdy z elementówsequence
w kolejności iteracji.Na bok
Będąc operatorem,
+
zwraca wynik wyrażenia jako nową wartość. Będącmutator
metodą nie łączącą ,list.extend()
modyfikuje listę tematów w miejscu i nic nie zwraca.Tablice
Dodałem to ze względu na potencjalne zamieszanie, jakie może spowodować powyższa odpowiedź Abla, mieszając dyskusję na temat list, sekwencji i tablic.
Arrays
zostały dodane do Pythona po sekwencjach i listach, jako bardziej efektywny sposób przechowywania tablic integralnych typów danych. Nie mylarrays
zlists
. One nie są takie same.Z dokumentacji tablicy :
Tablice są typami sekwencji i zachowują się bardzo podobnie do list, z wyjątkiem tego, że typ przechowywanych w nich obiektów jest ograniczony. Typ jest określany w czasie tworzenia obiektu przy użyciu kodu typu, który jest pojedynczym znakiem.
źródło
append
dołącza element do listy. jeśli chcesz rozszerzyć listę o nową listę, której musisz użyćextend
.źródło
+
iextend
przyniosło inne rezultaty, o których moglibyśmy pomyśleć.append
i+
są różne. Dlatego. Podoba mi się ta odpowiedź, ponieważ oferuje coś, co ma większy sens.__lt__
nie można go przeciążać w Pythonie (obecnie jest to możliwe). Pytania „dlaczego” są najbardziej istotne, ale często najtrudniejsze do udzielenia odpowiedzi: proszą o esencję, a nie o wskazówkę do instrukcji. I oczywiście: jeśli nie podoba ci się pytanie (nie lubię najbardziej), to nie odpowiadaj ;-)c += [c]
ic.append(c[:])
też.a+b != a*b
? To różne operacje. To jest odpowiedź. „Dlaczego” nie jest tak pomocne, jak inne pytania, na przykład „Jak prawidłowo dołączyć?” Lub „Co jest nie tak z tym dodatkiem, który prowadzi do nieskończonej rekurencji?” Pytania w formularzu „Co mam zrobić z X” lub „Co poszło nie tak, gdy zrobiłem X”? Lub „Co powinienem zrobić zamiast X” również pomoże komuś w nauce, ale dostarczy ukierunkowanych, użytecznych i wykonalnych odpowiedzi.Listy Pythona są niejednorodne, to znaczy elementy na tej samej liście mogą być obiektami dowolnego typu. Wyrażenie:
c.append(c)
dołącza obiektc
do listy, co kiedykolwiek może być. W przypadku, gdy sama lista staje się członkiem listy.Wyrażenie
c += c
dodaje dwie listy razem i przypisuje wynik do zmiennejc
. Przeciążony+
operator jest definiowany na listach, aby utworzyć nową listę, której zawartością są elementy z pierwszej listy i elementy z drugiej listy.Są to więc tak naprawdę różne wyrażenia używane do robienia różnych rzeczy zgodnie z projektem.
źródło
Metoda, której szukasz, to
extend()
. Z dokumentacji Pythona :źródło
powinieneś użyć rozszerzenia ()
inne informacje: dołącz vs. rozszerz
źródło
Zobacz dokumentację :
c.append(c)
„dołącza” c do siebie jako element . Ponieważ lista jest typem referencyjnym, tworzy to rekurencyjną strukturę danych.c += c
jest odpowiednikiemextend(c)
, który dołącza elementy c do c.źródło