Diferentes formas de borrar listas


208

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

old_list = []
old_list = list()

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

del old_list[ 0:len(old_list) ]

1
¿Por qué estás haciendo esto? La recolección de basura funciona. ¿Por qué no simplemente ignorar el valor de la lista anterior y dejar que Python lo limpie automáticamente?
S.Lott

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

1
También podría hacer: while l: l.pop ()
RoadieRich

12
Jajaja Estoy seguro de que es eficiente.
FogleBird

18
No está relacionado con su pregunta, pero no debe usar len al especificar un segmento. a[:x]significa comenzar a xy a[x:]significa x al final. 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

Respuestas:


358

Borrar una lista en su lugar afectará a todas las demás 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 este sí:

>>> 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 puedes hacer:

>>> a[:] = []

87
También podrías hacerlodel a[:]
idbrii

1
¿Por qué el primero solo afectará a? Pensé ay hice breferencia al mismo objeto ... Solo quiero saber por qué. Gracias.
Alston

38
Con python 3.3 y versiones posteriores puedes seguir a.clear(), ¡no hay problema!
Marek Lewandowski

44
@Stallman porque al principio está cambiando una referencia para que 'a' apunte a una nueva matriz, no borrando una, yb todavía señala una antigua
Pax0r

44
¡Sería genial si alguien puede mostrar la diferencia de rendimiento entre esos métodos!
Suanmeiguo

37

Hacer alist = []no borra la lista, solo crea una lista vacía y la vincula a la variable alist. La lista anterior seguirá existiendo si tuviera otros enlaces variables.

Para borrar una lista en el lugar , puede usar cualquiera de estas formas:

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

Consulte la página de documentación de Tipos de secuencia mutable para obtener más detalles.


2
He probado y alist * = 0 es el más rápido, el siguiente más rápido es alist.clear () y otros dos métodos son igualmente rápidos. ¿Podría explicar por qué alist * = 0 es el más rápido?
Jenny

3
@Jenny: Simplemente utiliza menos (o menos caros) opcodes bajo el capó. Por ejemplo, la versión del operador no necesita buscar ningún nombre de método o crear segmentos.
Eugene Yarmash

"Debería haber una, y preferiblemente solo una, forma obvia de hacerlo". Python está brillando aquí :)
Nik O'Lai

36

Hay una manera muy simple de borrar una lista de Python. Use del list_name [:] .

Por ejemplo:

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

13

Me parece que del le devolverá la memoria, mientras que la asignación de una nueva lista hará que la anterior se elimine solo cuando se ejecute gc.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 en cuanto se descarta su última referencia.
Algorias

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

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

6
del list[:] 

Eliminará los valores de esa variable de lista

del list

Eliminará la variable de la memoria


5

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

  1. Desea usar el nombre old_listmás adelante en su código;
  2. Desea que la lista anterior se recolecte basura lo antes posible para liberar algo de memoria;

En el caso 1, simplemente continúe con la tarea:

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

En el caso 2, la deldeclaración reduciría el recuento de referencias al objeto de lista al que old listapunta el nombre . Si el nombre de la lista solo apunta old_listal objeto, el recuento de referencia sería 0 y el objeto se liberaría para la recolección de elementos no utilizados.

    del old_list

3

Si está limpiando la lista, obviamente, ya no la necesita. Si es así, puede eliminar toda la lista con el método simple del.

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

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

del a[:]

-4

Otra solución que funciona bien es crear una lista vacía como una lista vacía de referencia.

empt_list = []

por ejemplo tienes una lista como a_list = [1,2,3]. Para borrarlo solo haga lo siguiente:

a_list = list(empt_list)

esto hará a_listuna lista vacía al igual que empt_list.


No hay razón para crear empt_list. Solo usa a_list = list ().
Daniel Harding
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.