Diversi modi di cancellare gli elenchi


208

C'è qualche motivo per fare qualcosa di più complicato di una di queste due righe quando si desidera cancellare un elenco in Python?

old_list = []
old_list = list()

Il motivo per cui chiedo è che ho appena visto questo in alcuni codici in esecuzione:

del old_list[ 0:len(old_list) ]

1
Perché stai facendo questo? Garbage Collection funziona. Perché non semplicemente ignorare il vecchio valore dell'elenco e lasciare che Python lo ripulisca automaticamente?
S. Lott,

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

1
Potresti anche fare: while l: l.pop ()
RoadieRich

12
LOL. Sono sicuro che sia efficiente.
FogleBird,

18
Non correlato alla tua domanda, ma non dovresti usare len quando specifichi una sezione. a[:x]significa che inizia a x e a[x:]significa che x finisce. a[ 0:len(a) ]può essere scritto come a[:]. Puoi anche usare i negativi per contare dalla fine ( a[-1]è l'ultimo elemento).
idbrii,

Risposte:


358

La cancellazione di un elenco in atto influirà su tutti gli altri riferimenti dello stesso elenco.

Ad esempio, questo metodo non influisce su 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

Puoi anche fare:

>>> a[:] = []

87
Potresti anche faredel a[:]
idbrii il

1
Perché il primo interesserà solo a? Ho pensato ae briferimento allo stesso oggetto ... Voglio solo sapere perché. Grazie.
Alston,

38
Con Python 3.3 e versioni successive puoi procedere a.clear()senza problemi!
Marek Lewandowski,

4
@Stallman perché in un primo momento stai cambiando un riferimento per 'a' per indicare un nuovo array, non per cancellarne uno, e b ne indica ancora uno vecchio
Pax0r

4
Sarebbe bello se qualcuno potesse mostrare la differenza di prestazioni tra questi metodi!
Suanmeiguo,

37

Fare alist = []non cancella l'elenco, crea semplicemente un elenco vuoto e lo lega alla variabile alist. Il vecchio elenco esisterà ancora se avesse altri collegamenti variabili.

Per cancellare effettivamente un elenco sul posto , è possibile utilizzare uno di questi modi:

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

Vedere la pagina della documentazione Tipi di sequenza mutabili per maggiori dettagli.


2
Ho testato e alist * = 0 è il più veloce, il successivo più veloce è alist.clear () e altri due metodi sono ugualmente veloci. Potresti spiegare perché alist * = 0 è il più veloce?
Jenny,

3
@Jenny: Si usa semplicemente un numero inferiore (o meno costosi) codici operativi sotto il cofano. Ad esempio, la versione dell'operatore non deve cercare nomi di metodi o creare sezioni.
Eugene Yarmash,

"Dovrebbe esserci uno - e preferibilmente solo un - modo oscuro di farlo." Python splende qui :)
Nik O'Lai il

36

C'è un modo molto semplice per cancellare un elenco Python. Usa del list_name [:] .

Per esempio:

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

13

Mi sembra che del ti restituirà la memoria, mentre l'assegnazione di un nuovo elenco farà cancellare quello vecchio solo quando gc esegue.matter.

Ciò può essere utile per elenchi di grandi dimensioni, ma per elenchi di piccole dimensioni dovrebbe essere trascurabile.

Modifica : come Algorias, 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
Algoria: questo è vero per CPython, ma potrebbe non essere per altre implementazioni.
mhsmith,

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

6
del list[:] 

Eliminerà i valori di quella variabile di elenco

del list

Eliminerà la variabile stessa dalla memoria


5

Esistono due casi in cui potresti voler cancellare un elenco:

  1. Vuoi usare old_listulteriormente il nome nel tuo codice;
  2. Volete che la vecchia lista venga spazzata via appena possibile per liberare memoria;

Nel caso 1 prosegui semplicemente con l'asserzione:

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

Nel caso 2 l' delistruzione ridurrebbe il conteggio dei riferimenti all'oggetto elenco old lista cui punta il nome . Se l'oggetto elenco è puntato solo dal nome old_lista, il conteggio dei riferimenti sarebbe 0 e l'oggetto verrebbe liberato per la garbage collection.

    del old_list

3

Se stai cancellando l'elenco, ovviamente, non hai più bisogno dell'elenco. In tal caso, puoi semplicemente eliminare l'intero elenco semplicemente con il metodo del.

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

Ma nel caso ne avessi di nuovo bisogno, puoi reinizializzarlo. O semplicemente cancellare i suoi elementi da

del a[:]

-4

un'altra soluzione che funziona correttamente è quella di creare un elenco vuoto come elenco vuoto di riferimento.

empt_list = []

per esempio hai un elenco come a_list = [1,2,3]. Per cancellarlo basta effettuare le seguenti operazioni:

a_list = list(empt_list)

questo renderà a_listun elenco vuoto proprio come il empt_list.


Nessun motivo per creare empt_list. Usa a_list = list ().
Daniel Harding
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.