Come svuotare un elenco?


356

Sembra così "sporco" svuotare un elenco in questo modo:

while len(alist) > 0 : alist.pop()

Esiste un modo chiaro per farlo?


28
Quindi perché i dadi e gli insiemi di Python hanno un metodo clear (), ma non elenchi?
lavoro

13
Ma se ci sono più riferimenti all'oggetto, potrebbe essere utile.
Ned Deily,

3
Potrebbe essere utile se ho bisogno di cancellare un elenco condiviso sui processi in fase di esecuzione e non ho bisogno di aspettare la raccolta (o sbaglio? Ho frainteso la raccolta dei rifiuti?). Inoltre, se voglio controllare ogni elemento spuntato, posso eseguire il debug mentre non riesco a utilizzare lo slicing (o sbaglio). Non è necessario interrompere l'esecuzione del processo mentre si cancella l'elenco.
DrFalk3n,

2
@ S.Lott Solo perché non capisci perché questo è importante non significa che il resto di noi non lo faccia. Se più oggetti dipendono da un elenco comune, sarà importante. In diversi modelli di progettazione questo è importante. Garbage Collector significa che non devi ripulire dopo te stesso; non è una licenza per fare più casino.
UpAndAdam,

4
Nonostante qualsiasi altra, migliore risposta, il tuo codice iniziale avrebbe potuto essere scritto: mentre alist: alist.pop ()
MrWonderful

Risposte:


570

Ciò rimuove effettivamente i contenuti dall'elenco, ma non sostituisce la vecchia etichetta con un nuovo elenco vuoto:

del lst[:]

Ecco un esempio:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Per completezza, l'assegnazione delle sezioni ha lo stesso effetto:

lst[:] = []

Può anche essere usato per ridurre una parte dell'elenco mentre si sostituisce una parte allo stesso tempo (ma non rientra nell'ambito della domanda).

Nota che fare lst = []non svuota la lista, crea semplicemente un nuovo oggetto e lo lega alla variabile lst, ma la vecchia lista avrà ancora gli stessi elementi, e l'effetto sarà evidente se avesse altre associazioni di variabili.


3
Altre due domande: che cos'è esattamente "del"? (Ne deduco le cose deletere ma non so davvero cosa sia) e 2 °: come leggi (ad alta voce) [:]
OscarRyz,

2
Per una valida
fortran,

14
Di solito non leggo ad alta voce il codice Python xD, ma se dovessi, penso che direi "fetta dall'inizio alla fine della lista l".
fortran,

2
@jellybean completamente non intenzionale ^ _ ^ L'inglese non è la mia lingua madre, quindi non ho notato il contrasto tra i due commenti.
fortran,

se facciamo l = [] i vecchi contenuti della lista non verrebbero raccolti dalla Python GC?
Alex Punnen,

168

Se si sta eseguendo Python 3.3 o superiore, è possibile utilizzare il clear()metodo list, che è parallela a clear()di dict, set, dequee di altri tipi di contenitori mutabili:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

Come per la pagina di documentazione collegata, lo stesso può essere ottenuto anche con alist *= 0.

Per riassumere, ci sono quattro modi equivalenti per cancellare un elenco sul posto (abbastanza contrario allo Zen di Python !):

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

6
Questa risposta dovrebbe essere al top, cosa c'è che non va nello stackoverflow!
BreakBadSP

clear () è meglio.
sailfish009

61

Puoi provare:

alist[:] = []

Ciò significa: giunzione nell'elenco [](0 elementi) nella posizione [:](tutti gli indici dall'inizio alla fine)

[:] È l'operatore slice. Vedi questa domanda per maggiori informazioni.


4
Perché non solo alist = []?
mitenka,

16
@mitenka che non svuota la lista, sovrascrive la variabile alistcon una lista diversa che sembra essere vuota. Se qualcun altro aveva un riferimento all'elenco originale, questo rimane com'è (cioè contiene tutto ciò che era in esso per cominciare)
Adam Batkin,

@mitenka Un'altra ragione è che alist.clear()o alist[:] = []aiuta a verificare che alistveramente è una lista. Supponiamo che tu sia alisttornato da una funzione foo(). Pensavi di aver foorestituito un elenco ma in effetti ha restituito a None. L'uso alist = []non può cogliere quell'errore.
aafulei,

32

si scopre che con Python 2.5.2 del l[:]è leggermente più lento di l[:] = []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
Python 2.5.2

1
In Python 2.7.2, sulla mia macchina, sono più o meno gli stessi. Entrambi funzionano da 13,5-13,7 usec per loop.
leetNightshade

Dovresti anche misurare python3 -mtimeit "l = list (range (1000))" "b = l [:]" per calcolare "b [:] = []" e "del b [:]". Fallo e lol ...
rockdaboot,

1
Ho fatto il benchmark con python 3.5 e sono d'accordo con leetNightshade. .clear(), del b[:]e b[:]=[]tutto funziona allo stesso modo ( b[:]=[]essendo leggermente più lento.
Conchylicultor

5
lst *= 0

ha lo stesso effetto di

lst[:] = []

È un po 'più semplice e forse più facile da ricordare. A parte questo, non c'è molto da dire

L'efficienza sembra essere più o meno la stessa


1
Per completezza, vale la pena ricordare che qualsiasi dato intero inferiore o uguale 0avrebbe lo stesso effetto. È un bel trucco però, sono un po 'triste, che non ha ricevuto molta attenzione ..
Peter Varo,

-1
list = []

verrà reimpostato listsu un elenco vuoto.

Si noti che in genere non è necessario ombreggiare i nomi di funzioni riservate, ad esempio listquale è il costruttore di un oggetto elenco - è possibile utilizzare lsto list_invece, ad esempio.


38
No: questo non modificherà l'elenco, questo assegna solo un elenco vuoto alla variabile list. Se ti aspettavi che una funzione modifichi un elenco passato (ad esempio), questo non farebbe quello che vuoi.
Adam Batkin,

10
Non proprio. La domanda è "Come svuotare un elenco" e non "Come assegnare su una variabile che contiene un elenco"
Adam Batkin,

6
la domanda non era ambigua, lo snippet dell'operazione stava estraendo elementi dall'elenco (tutto qui, modificandolo in posizione) ...
fortran,

7
Inoltre, "elenco" non deve essere utilizzato come nome di una variabile, poiché il tipo "elenco" è ombre. Molti sviluppatori Python usano "L" come nome di una variabile elenco, ma preferisco "lst".
Steveha,

1
A volte vuoi solo svuotare l'elenco e questo è buono come uno qualsiasi dei metodi proposti. Probabilmente anche più veloce
smac89,

-3

Un altro codice semplice che potresti usare (a seconda della situazione) è:

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Devi iniziare l'indice alla lunghezza dell'elenco e andare all'indietro contro l'indice a 0, in avanti perché ciò finirebbe con un indice uguale alla lunghezza dell'elenco con un taglio solo a metà.

Inoltre, assicurati che la linea while abbia un segno "maggiore o uguale a". Se lo si omette, resterà la lista [0] rimanente.


15
reinventare la ruota con un cubo
CONvid19

Haha. Questa è la seconda strana risposta (+ un commento appropriato) che ho riscontrato su SO. Dovrebbe esserci un sito per queste cose memorabili: D
akinuri,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.