Entonces, ¿por qué los dictados y conjuntos de Python tienen un método clear (), pero no listas?
trabajo
13
Pero si hay múltiples referencias al objeto, podría ser útil.
Ned Deily
3
Puede ser útil si necesito borrar una lista compartida de los procesos en tiempo de ejecución y no necesito esperar a que se efectúen los garbaging (¿o me equivoco? ¿Entendí mal la recolección de basura?). Además, si quiero verificar cada elemento emergente, puedo depurarlo mientras no puedo usar el corte (o me equivoco). No necesito detener la ejecución del proceso mientras borro mi lista.
DrFalk3n
2
@ S.Lott El hecho de que no entiendas por qué esto es importante no significa que el resto de nosotros no. Si varios objetos dependen de una lista común, será importante. En varios patrones de diseño esto es importante. El recolector de basura significa que no tienes que limpiar después de ti mismo; No es una licencia hacer más desorden.
UpAndAdam
44
A pesar de cualquier otra respuesta mejor, su código inicial podría haberse escrito: while alist: alist.pop ()
MrWonderful
Respuestas:
570
En realidad, esto elimina el contenido de la lista, pero no reemplaza la etiqueta anterior con una nueva lista vacía:
del lst[:]
Aquí hay un ejemplo:
lst1 =[1,2,3]
lst2 = lst1
del lst1[:]print(lst2)
En aras de la integridad, la asignación de corte tiene el mismo efecto:
lst[:]=[]
También se puede usar para reducir una parte de la lista mientras se reemplaza una parte al mismo tiempo (pero eso está fuera del alcance de la pregunta).
Tenga en cuenta que hacer lst = []no vacía la lista, solo crea un nuevo objeto y lo vincula a la variable lst, pero la lista anterior seguirá teniendo los mismos elementos, y el efecto será evidente si tuviera otras vinculaciones de variables.
Por lo general, no leo en voz alta el código de Python xD, pero si tuviera que hacerlo, creo que diría "cortar desde el principio hasta el final de la lista l".
fortran
2
@jellybean completamente involuntario ^ _ ^ El inglés no es mi lengua materna, por lo que realmente no noté el contraste entre los dos comentarios.
Fortran
si hacemos l = [], ¿el contenido de la lista anterior no será recolectado por Python GC?
Alex Punnen
168
Si se está utilizando Python 3.3 o mejor, se puede utilizar el clear()método de la list, que es paralela a la clear()de dict, set, dequey otros tipos de contenedores mutable:
alist.clear()# removes all items from alist (equivalent to del alist[:])
Según la página de documentación vinculada, lo mismo también se puede lograr con alist *= 0.
Para resumir, hay cuatro formas equivalentes de borrar una lista en el lugar (¡muy al contrario del Zen de Python !):
@mitenka que no vacía la lista, sobrescribe la variable alistcon una lista diferente que está vacía. Si alguien más tiene una referencia a la lista original, eso permanece tal cual (es decir, contiene lo que estaba en él para empezar)
Adam Batkin
@mitenka Otra razón es que alist.clear()o alist[:] = []ayuda a verificar que alistrealmente es una lista. Digamos que alistregresó de una función foo(). Pensaste que había foodevuelto una lista, pero de hecho, devolvió un None. Usar alist = []no puede atrapar ese error.
aafulei
32
Resulta que con Python 2.5.2, del l[:]es un poco más lento que l[:] = []con 1.1 usec.
$ python -mtimeit "l=list(range(1000))""b=l[:];del b[:]"10000 loops, best of 3:29.8 usec per loop
$ python -mtimeit "l=list(range(1000))""b=l[:];b[:] = []"10000 loops, best of 3:28.7 usec per loop
$ python -V
Python2.5.2
En Python 2.7.2, en mi máquina, son casi lo mismo. Ambos corren desde 13.5-13.7 usec por ciclo.
leetNightshade
También debe medir python3 -mtimeit "l = list (range (1000))" "b = l [:]" para calcular "b [:] = []" y "del b [:]". Do it and lol ...
rockdaboot
1
Hice el benchmark con python 3.5 y estoy de acuerdo con leetNightshade. .clear(), del b[:]y b[:]=[]todo funciona igual ( b[:]=[]siendo un poco más lento.
Conchylicultor
5
lst *=0
tiene el mismo efecto que
lst[:]=[]
Es un poco más simple y quizás más fácil de recordar. Aparte de eso, no hay mucho que decir
En aras de la exhaustividad, vale la pena mencionar que cualquier número entero que sea menor o igual que 0tendría el mismo efecto. Sin embargo, es un truco bastante bueno, estoy un poco triste porque no recibió mucha atención ...
Peter Varo
-1
list =[]
se restablecerá lista una lista vacía.
Tenga en cuenta que, por lo general, no debe sombrear los nombres de funciones reservadas, como, por ejemplo list, cuál es el constructor de un objeto de lista; podría utilizarlo lsto list_, por el contrario, por ejemplo.
No: esto no modificará la lista, solo asigna una lista vacía a la variable list. Si esperaba que una función modificara una lista aprobada (por ejemplo), esto no haría lo que desea.
Adam Batkin
10
Realmente no. La pregunta es "Cómo vaciar una lista" no "Cómo asignar sobre una variable que contiene una lista"
Adam Batkin
66
la cuestión no era ambigua, fragmento de la op fue apareciendo los elementos de la lista (eso es, modificándolo en su lugar) ...
FORTRAN
77
Además, "lista" no debe usarse como un nombre de variable, ya que es una sombra del tipo "lista". Muchos desarrolladores de Python usan "L" como nombre de variable de lista, pero prefiero "lst".
steveha
1
A veces solo quieres vaciar la lista y esto es tan bueno como cualquiera de los métodos propuestos. Probablemente aún más rápido
smac89
-3
Otro código simple que podría usar (dependiendo de su situación) es:
Debe comenzar el índice en la longitud de la lista e ir hacia atrás versus el índice en 0, hacia adelante porque eso terminaría con un índice igual a la longitud de la lista y solo se reduciría a la mitad.
Además, asegúrese de que la línea while tenga un signo "mayor o igual que". Omitirlo te dejará con la lista [0] restante.
Respuestas:
En realidad, esto elimina el contenido de la lista, pero no reemplaza la etiqueta anterior con una nueva lista vacía:
Aquí hay un ejemplo:
En aras de la integridad, la asignación de corte tiene el mismo efecto:
También se puede usar para reducir una parte de la lista mientras se reemplaza una parte al mismo tiempo (pero eso está fuera del alcance de la pregunta).
Tenga en cuenta que hacer
lst = []
no vacía la lista, solo crea un nuevo objeto y lo vincula a la variablelst
, pero la lista anterior seguirá teniendo los mismos elementos, y el efecto será evidente si tuviera otras vinculaciones de variables.fuente
Si se está utilizando Python 3.3 o mejor, se puede utilizar el
clear()
método de lalist
, que es paralela a laclear()
dedict
,set
,deque
y otros tipos de contenedores mutable:Según la página de documentación vinculada, lo mismo también se puede lograr con
alist *= 0
.Para resumir, hay cuatro formas equivalentes de borrar una lista en el lugar (¡muy al contrario del Zen de Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
fuente
Tu podrías intentar:
Lo que significa: empalme en la lista
[]
(0 elementos) en la ubicación[:]
(todos los índices de principio a fin)El [:] es el operador de corte. Vea esta pregunta para más información.
fuente
alist = []
?alist
con una lista diferente que está vacía. Si alguien más tiene una referencia a la lista original, eso permanece tal cual (es decir, contiene lo que estaba en él para empezar)alist.clear()
oalist[:] = []
ayuda a verificar quealist
realmente es una lista. Digamos quealist
regresó de una funciónfoo()
. Pensaste que habíafoo
devuelto una lista, pero de hecho, devolvió unNone
. Usaralist = []
no puede atrapar ese error.Resulta que con Python 2.5.2,
del l[:]
es un poco más lento quel[:] = []
con 1.1 usec.fuente
.clear()
,del b[:]
yb[:]=[]
todo funciona igual (b[:]=[]
siendo un poco más lento.tiene el mismo efecto que
Es un poco más simple y quizás más fácil de recordar. Aparte de eso, no hay mucho que decir
La eficiencia parece ser la misma.
fuente
0
tendría el mismo efecto. Sin embargo, es un truco bastante bueno, estoy un poco triste porque no recibió mucha atención ...se restablecerá
list
a una lista vacía.Tenga en cuenta que, por lo general, no debe sombrear los nombres de funciones reservadas, como, por ejemplo
list
, cuál es el constructor de un objeto de lista; podría utilizarlolst
olist_
, por el contrario, por ejemplo.fuente
list
. Si esperaba que una función modificara una lista aprobada (por ejemplo), esto no haría lo que desea.Otro código simple que podría usar (dependiendo de su situación) es:
Debe comenzar el índice en la longitud de la lista e ir hacia atrás versus el índice en 0, hacia adelante porque eso terminaría con un índice igual a la longitud de la lista y solo se reduciría a la mitad.
Además, asegúrese de que la línea while tenga un signo "mayor o igual que". Omitirlo te dejará con la lista [0] restante.
fuente