Jaka jest różnica pomiędzy:
some_list1 = []
some_list1.append("something")
i
some_list2 = []
some_list2 += ["something"]
Jaka jest różnica pomiędzy:
some_list1 = []
some_list1.append("something")
i
some_list2 = []
some_list2 += ["something"]
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Odpowiedzi:
W twoim przypadku jedyną różnicą jest wydajność: dołączanie jest dwa razy szybsze.
W ogólnym przypadku
append
doda jedną pozycję do listy, podczas gdy wszystkie elementy listy po prawej stronie+=
zostaną skopiowane do listy po lewej stronie.Aktualizacja: analiza perf
Porównując bajtkody możemy założyć, że
append
wersja marnuje cykle naLOAD_ATTR
+CALL_FUNCTION
, a + = wersja - naBUILD_LIST
. NajwyraźniejBUILD_LIST
przeważaLOAD_ATTR
+CALL_FUNCTION
.Możemy jeszcze bardziej poprawić wydajność, usuwając
LOAD_ATTR
narzut:źródło
append
z+=
, to musisz uwzględnić tworzenie listy jako część pomiaru. W przeciwnym razie byłoby inne pytanie (extend
vs+=
).W podanym przykładzie nie ma różnicy pod względem wydajności między
append
a+=
. Ale jest różnica międzyappend
i+
(o którą pierwotnie zadawano pytanie).Jak widać,
append
i+=
ten sam wynik; dodają pozycję do listy bez tworzenia nowej listy. Użycie+
dodaje dwie listy i tworzy nową listę.źródło
append
dodaje jeden wpis do listy, podczas gdy + = dodaje tyle, ile jest na drugiej liście (tj. Aliasy doextend
). Ale on / ona już o tym wie, sądząc po sposobie napisania pytania. Czy jest jakaś inna różnica, której brakuje?Zobacz, że append dodaje pojedynczy element do listy, którym może być cokolwiek.
+=[]
dołącza do list.źródło
+ = to przypisanie. Kiedy go używasz, naprawdę mówisz „some_list2 = some_list2 + [„ something ”]”. Zadania wymagają ponownego wiązania, więc:
Operator + = powinien również normalnie utworzyć nowy obiekt listy, tak jak zwykle robi to list + list:
Jednak w rzeczywistości:
Dzieje się tak, ponieważ listy Pythona implementują __iadd __ (), aby zamiast tego utworzyć + = rozszerzone zwarcie przypisania i wywołać list.extend (). (To trochę dziwna brodawka: zwykle robi to, co miałeś na myśli, ale z niejasnych powodów.)
Ogólnie rzecz biorąc, jeśli dołączasz / rozszerzasz istniejącą listę i chcesz zachować odniesienie do tej samej listy (zamiast tworzyć nową), najlepiej jest wyrazić się jednoznacznie i trzymać się metody append () / extension () metody.
źródło
jest aktualne
dla jednej wartości nie ma różnicy. Dokumentacja stwierdza, że:
Zatem oczywiście
s.append(x)
to samo cos.extend([x])
źródło
Różnica polega na tym, że concatenate spłaszczy wynikową listę, podczas gdy append zachowa poziomy nienaruszone:
Na przykład z:
Używając dołączania, otrzymujesz listę list:
Zamiast tego, używając konkatenacji, otrzymujesz płaską listę:
źródło
Testy wydajności tutaj są nieprawidłowe:
na przykład
dobre testy można znaleźć tutaj: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
źródło
+= [one_var]
. Jeśli pominiemy tworzenie list, + = stanie się najszybszą opcją.Oprócz aspektów opisanych w innych odpowiedziach, dołączanie i + [] zachowują się zupełnie inaczej, gdy próbujesz zbudować listę list.
lista1 + ['5', '6'] dodaje '5' i '6' do listy1 jako pojedyncze elementy. list1.append (['5', '6']) dodaje listę ['5', '6'] do list1 jako pojedynczy element.
źródło
Ponowne wiązanie, o którym mowa w innych odpowiedziach, ma znaczenie w pewnych okolicznościach:
Dzieje się tak, ponieważ przypisanie rozszerzone zawsze powoduje ponowne wiązanie, nawet jeśli obiekt został zmutowany w miejscu. Tak się składa, że następuje ponowne wiązanie
a[1] = *mutated list*
, które nie działa w przypadku krotek.źródło
weźmy najpierw przykład
źródło
Metoda append () dodaje pojedynczy element do istniejącej listy
Więc tutaj some_list1 zostanie zmodyfikowane.
Zaktualizowano:
Natomiast użycie + do łączenia elementów list (więcej niż jednego elementu) w istniejącej liście jest podobne do rozszerzenia (poprawione przez Flux ).
Więc tutaj some_list2 i ["coś"] to dwie listy, które są połączone.
źródło
+=
nie zwraca nowej listy. Programowanie FAQ mówi: „... na listach,__iadd__
jest równoznaczne z wywołaniemextend
na listy i powrót do listy Dlatego mówimy, że na listach.+=
Jest«skrótem»zalist.extend
”. Możesz to również zobaczyć na własne oczy w„+” nie zmienia listy
.append () mutuje starej listy
źródło