Sembra così "sporco" svuotare un elenco in questo modo:
while len(alist) > 0 : alist.pop()
Esiste un modo chiaro per farlo?
Sembra così "sporco" svuotare un elenco in questo modo:
while len(alist) > 0 : alist.pop()
Esiste un modo chiaro per farlo?
Risposte:
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.
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 !):
alist.clear() # Python 3.3+del alist[:]alist[:] = []alist *= 0Puoi 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.
alist = []?
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)
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.
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
.clear(), del b[:]e b[:]=[]tutto funziona allo stesso modo ( b[:]=[]essendo leggermente più lento.
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
0avrebbe lo stesso effetto. È un bel trucco però, sono un po 'triste, che non ha ricevuto molta attenzione ..
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.
list. Se ti aspettavi che una funzione modifichi un elenco passato (ad esempio), questo non farebbe quello che vuoi.
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.