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) ]
johannix
fuente
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[:] = []
Koba
fuente
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.

Eugene Yarmash
fuente
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
[] []
NixMan
fuente
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[:]
besen
fuente
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

Ytpillai
fuente
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
Alex
fuente
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[:]
lavee_singh
fuente
-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.

Mounir Ben
fuente
No hay razón para crear empt_list. Solo usa a_list = list ().
Daniel Harding