Różne sposoby czyszczenia list

207

Czy jest jakiś powód, aby robić coś bardziej skomplikowanego niż jeden z tych dwóch wierszy, jeśli chcesz wyczyścić listę w Pythonie?

old_list = []
old_list = list()

Powodem, dla którego pytam, jest to, że właśnie zobaczyłem to w jakimś działającym kodzie:

del old_list[ 0:len(old_list) ]
johannix
źródło
1
Dlaczego to robisz? Działa Garbage Collection. Dlaczego po prostu nie zignorować starej wartości listy i pozwolić Pythonowi wyczyścić ją automatycznie?
S.Lott
40
@ S.Lott: Plakat nie napisał kodu i pyta, dlaczego pierwotny pisarz mógł to zrobić.
John Fouhy,
1
Możesz także zrobić: while l: l.pop ()
RoadieRich
12
LOL. Jestem pewien, że to jest skuteczne.
FogleBird
18
Nie dotyczy twojego pytania, ale nie powinieneś używać len przy określaniu plastra. a[:x]oznacza początek od x i a[x:]oznacza x koniec. a[ 0:len(a) ]można zapisać jako a[:]. Możesz także używać negatywów do liczenia od końca ( a[-1]jest ostatnim elementem).
idbrii

Odpowiedzi:

356

Wyczyszczenie listy na miejscu wpłynie na wszystkie inne odwołania na tej samej liście.

Na przykład ta metoda nie wpływa na inne odwołania:

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]

Ale ten robi:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]      # equivalent to   del a[0:len(a)]
>>> print(a)
[]
>>> print(b)
[]
>>> a is b
True

Możesz także:

>>> a[:] = []
Koba
źródło
86
Możesz także zrobićdel a[:]
idbrii
1
Dlaczego pierwszy wpłynie tylko a? Myślałem ai bnawiązałem do tego samego obiektu ... Chcę tylko wiedzieć, dlaczego. Dzięki.
Alston,
37
Z Pythonem 3.3 i nowszymi możesz iść a.clear(), bez problemu!
Marek Lewandowski,
4
@Stallman, ponieważ na początku zmieniasz odniesienie dla „a”, aby wskazywało na nową tablicę, nie usuwając jednej, a b nadal wskazuje starą
Pax0r
4
Byłoby wspaniale, gdyby ktokolwiek mógł pokazać różnicę wydajności między tymi metodami!
Suanmeiguo
37

Wykonanie alist = []nie powoduje wyczyszczenia listy, po prostu tworzy pustą listę i wiąże ją ze zmienną alist. Stara lista będzie istnieć, jeśli będzie miała inne powiązania zmiennych.

Aby faktycznie wyczyścić listę w miejscu , możesz użyć dowolnego z następujących sposobów:

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

Więcej informacji znajduje się na stronie dokumentacji Zmiennych typów sekwencji .

Eugene Yarmash
źródło
2
Przetestowałem i alist * = 0 jest najszybszy, następny najszybszy to alist.clear (), a pozostałe dwie metody są równie szybkie. Czy możesz wyjaśnić, dlaczego alist * = 0 jest najszybszy?
Jenny
3
@Jenny: Po prostu używa mniej (lub tańszych) kodów pod maską. Na przykład wersja operatora nie musi wyszukiwać żadnych nazw metod ani budować plasterków.
Eugene Yarmash
„Powinien być jeden - a najlepiej tylko jeden - oczywisty sposób, aby to zrobić.” Python świeci tutaj :)
Nik O'Lai
36

Istnieje bardzo prosty sposób na wyczyszczenie listy python. Użyj del nazwa_listy [:] .

Na przykład:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []
NixMan
źródło
13

Wydaje mi się, że del zwróci ci pamięć, a przypisanie nowej listy spowoduje, że stara zostanie usunięta dopiero po uruchomieniu gc. Matter.

Może to być przydatne w przypadku dużych list, ale w przypadku małych list powinno być nieistotne.

Edycja : Jako Algorias nie ma to znaczenia.

Zauważ, że

del old_list[ 0:len(old_list) ]

jest równa

del old_list[:]
besen
źródło
2
gc nie jest uruchamiany w cyklach. Lista jest zwalniana, gdy tylko jej ostatnie odwołanie zostanie usunięte.
Algorias
2
Algorias: dotyczy to CPython, ale może nie dotyczyć innych implementacji.
mhsmith,
2
del old_list [0: len (old_list)] i del old_list [:] mają ten sam wynik, ale ten drugi jest szybszy (sprawdzony w Pythonie 2.6)
Roy Nieterau
6
del list[:] 

Usunie wartości tej zmiennej listy

del list

Usunie samą zmienną z pamięci

ytpillai
źródło
5

Istnieją dwa przypadki, w których możesz chcieć wyczyścić listę:

  1. Chcesz użyć nazwy w old_listdalszej części kodu;
  2. Chcesz, aby stara lista była jak najszybciej usuwana, aby zwolnić trochę pamięci;

W przypadku 1 po prostu kontynuujesz zadanie:

    old_list = []    # or whatever you want it to be equal to

W przypadku 2 delinstrukcja zmniejszyłaby liczbę odwołań do obiektu listy, na który old listwskazuje nazwa . Jeśli obiekt listy jest wskazywany tylko przez nazwę old_listat, liczba odwołań wynosiłaby 0, a obiekt zostałby zwolniony do wyrzucania elementów bezużytecznych.

    del old_list
Alex
źródło
3

Jeśli wyczyścisz listę, oczywiście już jej nie potrzebujesz. Jeśli tak, możesz po prostu usunąć całą listę za pomocą prostej metody del.

a = [1, 3, 5, 6]
del a # This will entirely delete a(the list).

Ale w razie potrzeby możesz go ponownie zainicjować. Lub po prostu wyczyść jego elementy

del a[:]
lavee_singh
źródło
-4

innym rozwiązaniem, które działa dobrze, jest utworzenie pustej listy jako pustej listy referencyjnej.

empt_list = []

na przykład masz listę jako a_list = [1,2,3]. Aby to wyczyścić, wykonaj następujące czynności:

a_list = list(empt_list)

spowoduje to a_listutworzenie pustej listy, takiej jak empt_list.

Mounir Ben
źródło
Nie ma powodu, aby utworzyć listę empt. Wystarczy użyć a_list = list ().
Daniel Harding