2009-05-12 4 views
159

C'è qualche motivo per fare qualcosa di più complicato di una di queste due righe quando si desidera cancellare una lista in Python?Diversi modi di cancellare gli elenchi

old_list = [] 
old_list = list() 

Il motivo che mi chiedo è che ho appena visto questo in un certo codice in esecuzione:

del old_list[ 0:len(old_list) ] 
+1

Perché stai facendo questo? Garbage Collection funziona. Perché non ignorare semplicemente il vecchio valore di lista e lasciare che Python lo pulisca automaticamente? –

+32

@ S.Lott: il poster non ha scritto il codice e chiede perché lo scrittore originale potrebbe averlo fatto. –

+14

Non correlato alla domanda, ma non si deve usare len quando si specifica una porzione. 'a [: x]' significa che inizia con x e 'a [x:]' significa x alla fine. 'a [0: len (a)]' può essere scritto come 'a [:]'. Puoi anche usare i negativi per contare alla fine ('a [-1]' è l'ultimo elemento). – idbrii

risposta

303

Cancellazione di una lista in luogo interesserà tutti gli altri riferimenti della stessa lista.

Ad esempio, questo metodo non influisce sugli altri riferimenti:

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

Ma questo fa:

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

Si potrebbe anche fare:

>>> a[:] = [] 
+6

Hmm, impari qualcosa di nuovo ogni giorno. –

+80

Si potrebbe anche fare 'del a [:]' – idbrii

+1

Perché il primo influenzerà solo 'a'? Ho pensato a 'a' e' b' come riferimento allo stesso oggetto ... Voglio solo sapere perché. Grazie. – Stallman

11

Risulta per me che del ti restituirà il ricordo, mentre assegnando una nuova lista farai il vecchio cancellato solo quando gc runs.matter.

Questo può essere utile per elenchi di grandi dimensioni, ma per la lista piccola dovrebbe essere trascurabile.

Modifica: Come Algoria, non importa.

Nota che

del old_list[ 0:len(old_list) ] 

è equivalente a

del old_list[:] 
+2

gc non viene eseguito in cicli. L'elenco viene liberato non appena viene eliminato l'ultimo riferimento. – Algorias

+2

Algorias: è vero per CPython, ma potrebbe non essere adatto ad altre implementazioni. – mhsmith

+1

del old_list [0: len (old_list)] e del old_list [:] hanno lo stesso risultato, ma quest'ultimo è più veloce (controllato in Python 2.6) –

4

Ci sono due casi in cui si potrebbe desiderare di cancellare l'elenco:

  1. Si desidera utilizzare il nome old_list ulteriormente nel tuo codice;
  2. Si desidera che la vecchia lista sia raccolta dei dati non appena possibile per liberare memoria;

Nel caso 1 basta andare avanti con l'assigment:

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

Nel caso 2 dichiarazione del ridurrebbe il numero di riferimento all'elenco oggetto il nome old list punti a. Se l'oggetto elenco è puntato solo con il nome old_list in, il conteggio dei riferimenti sarà 0 e l'oggetto verrà liberato per la garbage collection.

del old_list 
30

C'è un modo molto semplice per eliminare un elenco python. Utilizzare del nome_elenco [:].

Ad esempio:

>>> a = [1, 2, 3]` 
>>> b = a 
>>> del a[:] 
>>> print a, b 
[] [] 
3
del list[:] 

cancellerà i valori di quella lista variabili

del list 

eliminerà la variabile stessa dalla memoria

1

Se stai aprendo la lista , tu, ovviamente, non hai più bisogno della lista. Se è così, puoi semplicemente cancellare l'intero elenco con il semplice metodo del.

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

Ma nel caso in cui sia necessario, è possibile reinizializzarlo. O semplicemente basta cancellare i suoi elementi di

del a[:] 
-1

un'altra soluzione che funziona bene è creare una lista vuota come lista vuota di riferimento.

empt_list = [] 

ad esempio si dispone di un elenco come a_list = [1,2,3]. Per cancellare solo fare la seguente:

a_list = list(empt_list) 

questo renderà a_list un elenco vuoto, proprio come il empt_list.

2

Per cancellare un elenco sul posto in Python 3.3+ è possibile utilizzare anche list.clear(), che è coerente con le interfacce di altri contenitori mutabili (come dict, set o deque).

old_list.clear() # removes all items from old_list (same as del old_list[:])