En python, ¿hay alguna diferencia entre llamar clear()
y asignar {}
a un diccionario? ¿Y si si, que? Ejemplo:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
python
dictionary
Marcin
fuente
fuente
Respuestas:
Si tiene otra variable que también se refiere al mismo diccionario, hay una gran diferencia:
Esto se debe a que la asignación
d = {}
crea un nuevo diccionario vacío y lo asigna a lad
variable. Esto dejad2
apuntando al antiguo diccionario con elementos todavía en él. Sin embargo,d.clear()
borra el mismo diccionario qued
yd2
ambos apuntan a.fuente
d = {}
creará una nueva instancia para,d
pero todas las demás referencias seguirán apuntando a los contenidos anteriores.d.clear()
restablecerá el contenido, pero todas las referencias a la misma instancia seguirán siendo correctas.fuente
Además de las diferencias mencionadas en otras respuestas, también hay una diferencia de velocidad. d = {} es más del doble de rápido:
fuente
d = {}
debería ser más rápida ya que la limpieza completa puede dejarse en el recolector de basura para más adelante.Como ilustración de las cosas ya mencionadas anteriormente:
fuente
.clear
modifica el objeto pero `= {}` crea un nuevo objeto.Además de la respuesta de @odano, parece que el uso
d.clear()
es más rápido si desea borrar el dict muchas veces.El resultado es:
fuente
Los métodos de mutación siempre son útiles si el objeto original no está dentro del alcance:
Reasignar el diccionario crearía un nuevo objeto y no modificaría el original.
fuente
Una cosa que no se menciona son los problemas de alcance. No es un gran ejemplo, pero aquí está el caso en el que me encontré con el problema:
La solución es reemplazar
c_kwargs = {}
conc_kwargs.clear()
Si alguien piensa en un ejemplo más práctico, siéntase libre de editar esta publicación.
fuente
global c_kwargs
probablemente también funcionaría no? Aunque probablementeglobal
no sea lo mejor para usar mucho.global
haría que la función se comportara de manera diferente: todas las llamadas a conf_decorator compartirían la misma variable c_kwargs. Creo que Python 3 agregó lanonlocal
palabra clave para abordar este problema, y eso funcionaría.Además, a veces la instancia dict puede ser una subclase de dict (
defaultdict
por ejemplo). En ese caso,clear
se prefiere usar , ya que no tenemos que recordar el tipo exacto del dict, y también evitar el código duplicado (acoplar la línea de compensación con la línea de inicialización).fuente