2009-05-12 18 views
159

¿Hay alguna razón para hacer algo más complicado que una de estas dos líneas cuando desea borrar una lista en Python?Diferentes formas de borrar listas

old_list = [] 
old_list = list() 

La razón que pido es que acabo de ver esto en algún código en ejecución:

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

¿Por qué haces esto? Garbage Collection funciona. ¿Por qué no simplemente ignorar el valor de la lista anterior y dejar que Python lo limpie automáticamente? –

+32

@ S.Lott: el póster no escribió el código y pregunta por qué el escritor original pudo haberlo hecho. –

+14

No está relacionado con su pregunta, pero no debe usar len al especificar un sector. 'a [: x]' significa comenzar a x y 'a [x:]' significa x para finalizar. 'a [0: len (a)]' se puede escribir como 'a [:]'. También puede usar negativos para contar desde el final ('a [-1]' es el último elemento). – idbrii

Respuesta

303

Eliminación de una lista en su lugar afectará a todas las otras referencias de la misma lista.

Por ejemplo, este método no afecta a otras referencias:

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

Pero esto se hace:

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

También puede hacer:

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

Hmm, aprendes algo nuevo todos los días. –

+80

También podría hacer 'del a [:]' – idbrii

+1

¿Por qué el primero solo afectará a 'a'? Pensé 'a' y' b' referencia al mismo objeto ... Solo quiero saber por qué. Gracias. – Stallman

11

Parece para mí que del te devolverá la memoria, mientras que la asignación de una nueva lista hará que la anterior sea borrado solo cuando el gc runs.matter.

Esto puede ser útil para listas grandes, pero para listas pequeñas debería ser insignificante.

Editar: Como Algorias, no importa.

Tenga en cuenta que

del old_list[ 0:len(old_list) ] 

es equivalente a

del old_list[:] 
+2

gc no se ejecuta en ciclos. La lista se libera tan pronto como se descarta su última referencia. – Algorias

+2

Algorias: eso es cierto para CPython, pero puede no serlo para otras implementaciones. – mhsmith

+1

del old_list [0: len (old_list)] y del old_list [:] tienen el mismo resultado, pero el último es más rápido (marcado en Python 2.6) –

4

Hay dos casos en los que es posible que desee borrar una lista:

  1. Desea utilizar el nombre old_list más en tu código;
  2. Desea que la lista anterior sea recogida lo antes posible para liberar algo de memoria;

En el caso 1 que acaba de ir adelante con el assigment:

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

En el caso 2 la declaración del reduciría el número de referencias a la lista de objetos del nombre old list puntos al. Si el objeto de la lista solo apunta con el nombre old_list at, el recuento de referencia sería 0 y el objeto se liberaría para la recolección de elementos no utilizados.

del old_list 
30

Hay una manera muy simple de eliminar una lista de python. Use del list_name [:].

Por ejemplo:

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

borrará los valores de esa lista de variables

del list 

eliminará la propia variable de la memoria

1

Si va a borrar la lista , usted, obviamente, ya no necesita la lista. Si es así, simplemente puede eliminar la lista completa por simple del método.

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

Pero en caso de que lo necesite de nuevo, puede reiniciarlo. O simplemente borrar sus elementos por

del a[:] 
-1

otra solución que funciona bien es la creación de una lista vacía como una referencia lista vacía.

empt_list = [] 

por ejemplo, tiene una lista como a_list = [1,2,3]. Para borrar simplemente hacer lo siguiente:

a_list = list(empt_list) 

esto hará que a_list una lista vacía al igual que el empt_list.

2

Para borrar una lista en el lugar en Python 3.3+ también puede utilizar list.clear(), que es coherente con las interfaces de otros recipientes mutables (como dict, set o deque).

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