Dlaczego więc słowniki i zestawy Pythona mają metodę clear (), ale nie listy?
praca
13
Ale jeśli istnieje wiele odwołań do obiektu, może być przydatny.
Ned Deily,
3
Może to być przydatne, jeśli muszę wyczyścić listę współdzieloną procesów w czasie wykonywania i nie muszę czekać na zniekształcenie (czy się mylę? Czy źle zrozumiałem zbieranie śmieci?). Również jeśli chcę sprawdzić każdy wyskakujący element, mogę go debugować, gdy nie mogę używać krojenia (lub się mylę). Nie muszę przerywać wykonywania procesu podczas czyszczenia mojej listy.
DrFalk3n,
2
@ S.Lott To, że nie rozumiesz, dlaczego jest to ważne, nie oznacza, że reszta z nas tego nie rozumie. Jeśli wiele obiektów zależy od wspólnej listy, będzie to miało znaczenie. Jest to ważne w kilku wzorach projektowych. Śmieciarka oznacza, że nie musisz sprzątać po sobie; to nie jest licencja, aby zrobić więcej bałaganu.
UpAndAdam
4
Niezależnie od innych, lepszych odpowiedzi, twój początkowy kod mógł zostać napisany: while alist: alist.pop ()
MrWonderful
Odpowiedzi:
570
To faktycznie usuwa zawartość z listy, ale nie zastępuje starej etykiety nową, pustą listą:
del lst[:]
Oto przykład:
lst1 =[1,2,3]
lst2 = lst1
del lst1[:]print(lst2)
Ze względu na kompletność przypisanie plasterka ma ten sam efekt:
lst[:]=[]
Można go również użyć do zmniejszenia części listy przy jednoczesnej wymianie części (ale to nie wchodzi w zakres pytania).
Zauważ, że czynność lst = []nie powoduje opróżnienia listy, po prostu tworzy nowy obiekt i wiąże go ze zmienną lst, ale stara lista nadal będzie miała te same elementy, a efekt będzie widoczny, jeśli miał inne powiązania zmiennych.
Dwa kolejne pytania: Czym dokładnie jest „del”? (Wydedukuję to, że usuwa rzeczy, ale tak naprawdę nie wiem, co to jest) i po drugie: Jak czytasz (na głos) [:]
Zwykle nie czytam głośnego kodu python xD, ale gdybym musiał, powiedziałbym, że „odcinam od początku do końca listy l”.
fortran
2
@jellybean całkowicie niezamierzony ^ _ ^ Angielski nie jest moim językiem ojczystym, więc naprawdę nie zauważyłem kontrastu między tymi dwoma komentarzami.
fortran
jeśli zrobimy l = [] czy zawartość starej listy nie zostanie wyrzucona przez Python GC?
Alex Punnen
168
Jeśli używasz języka Python 3.3 lub nowszego, możesz użyć clear() metody list, która jest równoległa do clear()z dict, set, dequei inne rodzaje zmienny w opakowaniu:
alist.clear()# removes all items from alist (equivalent to del alist[:])
Podobnie jak w przypadku strony z dołączoną dokumentacją, to samo można osiągnąć za pomocą alist *= 0.
Podsumowując, istnieją cztery równoważne sposoby wyczyszczenia listy w miejscu (zupełnie w przeciwieństwie do Zen Pythona !):
@mitenka, który nie opróżnia listy, zastępuje zmienną alistinną listą, która okazuje się być pusta. Jeśli ktoś miał odniesienie do oryginalnej listy, pozostaje ona taka, jaka jest (tzn. Zawiera to, co na niej było na początku)
Adam Batkin
@mitenka Innym powodem jest to, że alist.clear()albo alist[:] = []ułatwia sprawdzenie, czy alistrzeczywiście jest lista. Powiedz, że wróciłeś alistz funkcji foo(). Myślałeś, że foozwrócił listę, ale rzeczywiście zwrócił None. Korzystanie alist = []nie może złapać tego błędu.
aafulei
32
okazuje się, że w Pythonie 2.5.2 del l[:]jest nieco wolniejszy niż l[:] = []w 1.1 usec.
$ python -mtimeit "l=list(range(1000))""b=l[:];del b[:]"10000 loops, best of 3:29.8 usec per loop
$ python -mtimeit "l=list(range(1000))""b=l[:];b[:] = []"10000 loops, best of 3:28.7 usec per loop
$ python -V
Python2.5.2
W Pythonie 2.7.2 na moim komputerze są one mniej więcej takie same. Oba działają od 13,5 do 13,7 usec na pętlę.
leetNightshade
Powinieneś także zmierzyć python3 -mtimeit "l = lista (zakres (1000))" "b = l [:]", aby obliczyć "b [:] = []" i "del b [:]". Zrób to i lol ...
rockdaboot
1
Zrobiłem test porównawczy z python 3.5 i zgadzam się z leetNightshade. .clear(), del b[:]i b[:]=[]wszystko przebiega tak samo ( b[:]=[]jest nieco wolniejsze.
Conchylicultor
5
lst *=0
ma taki sam efekt jak
lst[:]=[]
Jest to trochę prostsze i może łatwiejsze do zapamiętania. Poza tym nie ma wiele do powiedzenia
Dla kompletności warto wspomnieć, że każda liczba całkowita mniejsza lub równa 0miałaby ten sam efekt. Jest to całkiem fajna sztuczka, jestem trochę smutny, że nie spotkała się z dużym zainteresowaniem ..
Peter Varo
-1
list =[]
zresetuje się listdo pustej listy.
Zauważ, że generalnie nie powinieneś ukrywać nazw funkcji zarezerwowanych, takich jak listkonstruktor obiektu listy - możesz na przykład użyć lstlub list_zamiast tego.
Nie: to nie zmodyfikuje listy, to po prostu przypisuje pustą listę do zmiennej list. Jeśli spodziewałeś się, że funkcja zmodyfikuje przekazaną listę (na przykład), nie zrobi tego, co chcesz.
Adam Batkin
10
Nie całkiem. Pytanie brzmi: „Jak wyczyścić listę” nie „Jak przypisać nad zmienną, która zawiera listę”
Adam Batkin
6
pytanie nie było dwuznaczne, fragment kodu operacji wyrzucał elementy z listy (to tyle, modyfikując je na miejscu) ...
fortran
7
Ponadto „lista” nie powinna być używana jako nazwa zmiennej, ponieważ jest cieniem typu „lista”. Wielu programistów Python używa „L” jako nazwy zmiennej listy, ale wolę „lst”.
steveha,
1
Czasami chcesz po prostu opróżnić listę i jest to tak dobre, jak każda z proponowanych metod. Prawdopodobnie jeszcze szybciej
smac89
-3
Kolejny prosty kod, którego można użyć (w zależności od sytuacji):
Musisz zacząć indeks od długości listy i przejść do tyłu w stosunku do indeksu od 0, do przodu, ponieważ w ten sposób otrzymamy indeks równy długości listy z przecięciem tylko o połowę.
Upewnij się również, że linia while ma znak „większy niż lub równy”. Pominięcie tego spowoduje pozostawienie listy [0].
Odpowiedzi:
To faktycznie usuwa zawartość z listy, ale nie zastępuje starej etykiety nową, pustą listą:
Oto przykład:
Ze względu na kompletność przypisanie plasterka ma ten sam efekt:
Można go również użyć do zmniejszenia części listy przy jednoczesnej wymianie części (ale to nie wchodzi w zakres pytania).
Zauważ, że czynność
lst = []
nie powoduje opróżnienia listy, po prostu tworzy nowy obiekt i wiąże go ze zmiennąlst
, ale stara lista nadal będzie miała te same elementy, a efekt będzie widoczny, jeśli miał inne powiązania zmiennych.źródło
Jeśli używasz języka Python 3.3 lub nowszego, możesz użyć
clear()
metodylist
, która jest równoległa doclear()
zdict
,set
,deque
i inne rodzaje zmienny w opakowaniu:Podobnie jak w przypadku strony z dołączoną dokumentacją, to samo można osiągnąć za pomocą
alist *= 0
.Podsumowując, istnieją cztery równoważne sposoby wyczyszczenia listy w miejscu (zupełnie w przeciwieństwie do Zen Pythona !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
źródło
Możesz spróbować:
Co oznacza: Podziel na liście
[]
(0 elementów) w miejscu[:]
(wszystkie indeksy od początku do końca)[:] Jest operatorem wycinania. Zobacz to pytanie, aby uzyskać więcej informacji.
źródło
alist = []
?alist
inną listą, która okazuje się być pusta. Jeśli ktoś miał odniesienie do oryginalnej listy, pozostaje ona taka, jaka jest (tzn. Zawiera to, co na niej było na początku)alist.clear()
alboalist[:] = []
ułatwia sprawdzenie, czyalist
rzeczywiście jest lista. Powiedz, że wróciłeśalist
z funkcjifoo()
. Myślałeś, żefoo
zwrócił listę, ale rzeczywiście zwróciłNone
. Korzystaniealist = []
nie może złapać tego błędu.okazuje się, że w Pythonie 2.5.2
del l[:]
jest nieco wolniejszy niżl[:] = []
w 1.1 usec.źródło
.clear()
,del b[:]
ib[:]=[]
wszystko przebiega tak samo (b[:]=[]
jest nieco wolniejsze.ma taki sam efekt jak
Jest to trochę prostsze i może łatwiejsze do zapamiętania. Poza tym nie ma wiele do powiedzenia
Wydajność wydaje się być prawie taka sama
źródło
0
miałaby ten sam efekt. Jest to całkiem fajna sztuczka, jestem trochę smutny, że nie spotkała się z dużym zainteresowaniem ..zresetuje się
list
do pustej listy.Zauważ, że generalnie nie powinieneś ukrywać nazw funkcji zarezerwowanych, takich jak
list
konstruktor obiektu listy - możesz na przykład użyćlst
lublist_
zamiast tego.źródło
list
. Jeśli spodziewałeś się, że funkcja zmodyfikuje przekazaną listę (na przykład), nie zrobi tego, co chcesz.Kolejny prosty kod, którego można użyć (w zależności od sytuacji):
Musisz zacząć indeks od długości listy i przejść do tyłu w stosunku do indeksu od 0, do przodu, ponieważ w ten sposób otrzymamy indeks równy długości listy z przecięciem tylko o połowę.
Upewnij się również, że linia while ma znak „większy niż lub równy”. Pominięcie tego spowoduje pozostawienie listy [0].
źródło