2015-05-31 6 views
32

Per favore qual è il modo più efficiente per svuotare una lista?qual è la differenza tra del a [:] e a = [] quando voglio svuotare una lista chiamata a in python?

Ho una lista chiamata a = [1,2,3]. Per cancellare il contenuto della lista di solito scrivo a = [ ]. Mi sono imbattuto in una funzione in python chiamata del. Voglio sapere se c'è una differenza tra del a [:] e quello che uso.

+1

proprio come un chiarimento, 'del' in python è in realtà uno _statement_, non un _function_. – mintchkin

+6

In Python 3, * per favore * usare 'a.clear()'. I documenti affermano che è equivalente a 'del a [:]' e * way * più leggibile. –

+2

E naturalmente anche 'a [:] = []' che più o meno fa lo stesso di 'del a [:]' – driax

risposta

59

C'è una differenza, e ha a che fare con il fatto che tale lista sia referenziata da più posti/nomi.

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

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

Utilizzando del a[:] cancella la lista esistente, il che significa che è ovunque riferimento diventerà una lista vuota.

Uso a = [] insiemi a per puntare a un nuovo elenco vuoto, il che significa che altri posti l'elenco originale è stato sincronizzato rimarranno non vuoto.

La chiave per capire qui è rendersi conto che quando assegni qualcosa a una variabile, questo fa semplicemente puntare il nome a una cosa. Le cose possono avere più nomi e cambiare ciò che indica un nome non cambia la cosa stessa.

+1

Questo esempio era chiaro e semplice da comprendere –

+0

Vorrei anche sottolineare che 'a = [] 'è più veloce di' del a [:] ' – JosiahDaniels

+3

@JosiahDaniels, che tecnicamente rimane vero solo se' a' non è l'ultimo riferimento alla lista. In tal caso, la riassegnazione attiverà la garbage collection per chiamare essenzialmente 'del a [:]' comunque dietro le quinte. – mintchkin

10

Questo può probabilmente meglio essere indicato:

>>> a = [1, 2, 3] 
>>> id(a) 
45556280 
>>> del a[:] 
>>> id(a) 
45556280 
>>> b = [4, 5, 6] 
>>> id(b) 
45556680 
>>> b = [] 
>>> id(b) 
45556320 

Quando si esegue a[:] si fa riferimento a tutti gli elementi all'interno della lista "assegnato" per a. L'istruzione del rimuove i riferimenti agli oggetti. Quindi, fare del a[:] significa "rimuovere tutti i riferimenti agli oggetti dall'elenco assegnato a a". La lista stessa non è cambiata. Possiamo vederlo con la funzione id, che ci dà un numero che rappresenta un oggetto in memoria. L'id dell'elenco prima di utilizzare del e dopo rimane lo stesso, ad indicare che lo stesso oggetto elenco è assegnato a a.

D'altra parte, quando si assegna una lista non vuota di b e quindi assegnare un nuovo elenco vuoto a b, le modifiche id. Questo perché abbiamo effettivamente spostato il riferimento b dall'elenco esistente [4, 5, 6] al nuovo elenco [].

Al di là solo l'identità degli oggetti che si sta trattando, ci sono altre cose di essere a conoscenza di:

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

Sia b e a si riferiscono alla stessa lista. La rimozione degli elementi dall'elenco a senza modificare l'elenco stesso modifica l'elenco in posizione. Siccome lo b fa riferimento allo stesso oggetto, vediamo lì lo stesso risultato. Se invece hai fatto a = [], allora a farà riferimento a una nuova lista vuota mentre b continua a fare riferimento all'elenco [1, 2, 3].

6
>>> list1 = [1,2,3,4,5] 
>>> list2 = list1 

Per ottenere una migliore comprensione, vediamo con l'aiuto di immagini ciò che accade internamente.

>>> list1 = [1,2,3,4,5] 

Questo crea un oggetto di lista e lo assegna a list1. Initialization of list1 in memory

>>> list2 = list1 

L'oggetto lista che list1 si riferiva è assegnato anche list2.

Ora, vediamo i metodi per svuotare un elenco e ciò che effettivamente accade internamente.

METODO-1: Impostare lista vuota []:

>>> list1 = [] 
>>> list2 
[1,2,3,4,5] 

Set list1 to empty list

Questo non elimina gli elementi della lista, ma elimina il riferimento alla lista. Quindi, list1 ora punta a una lista vuota ma tutti gli altri riferimenti avranno accesso a quel vecchio list1.
Questo metodo crea solo un nuovo oggetto elenco e lo assegna a list1. Rimarranno altri riferimenti.

METODO-2: Cancella utilizzando operatore porzione [:]:

>>> del list1[:] 
>>> list2 
[] 

Delete all elements of list1 using slice operator

Quando usiamo l'operatore porzione di eliminare tutti gli elementi della lista, allora tutti i luoghi in cui è referenziato, diventa una lista vuota. Quindi list2 diventa anche una lista vuota.

0

Bene, del utilizza solo un po 'meno spazio nel computer come implicito nella persona sopra di me. Il computer accetta ancora la variabile come lo stesso codice, tranne con un valore diverso. Tuttavia, quando alla variabile viene assegnato qualcos'altro, il computer assegna ad esso un codice ID completamente diverso per tenere conto della modifica della memoria richiesta.

Problemi correlati