Realmente no puedo pensar en ninguna razón por la cual Python necesita la del
palabra clave (y la mayoría de los idiomas parecen no tener una palabra clave similar). Por ejemplo, en lugar de eliminar una variable, uno simplemente podría asignarle None
. Y al eliminar de un diccionario, del
se puede agregar un método.
¿Hay alguna razón para quedarse del
en Python, o es un vestigio de los días previos a la recolección de basura de Python?
python
dictionary
python-internals
del
Jason Baker
fuente
fuente
del
.del
no es un vestigio de la recolección previa a la basura porque siempre podría haberlo hechoused = None
. Siempre tiene sentido tener una sintaxis específica para ello. Dado que ahora tenemos GC cilíndrico, los casos en los que desea usar cualquiera de los dos son pequeños.ERASE
(eliminar variables específicas) yCLEAR
(eliminar todas las variables)Respuestas:
En primer lugar, puede eliminar otras cosas además de las variables locales.
Ambos deberían ser claramente útiles. En segundo lugar, el uso
del
de una variable local aclara la intención. Comparar:a
Sé en el caso de
del foo
que la intención es eliminar la variable del alcance. No está claro que esofoo = None
esté haciendo. Si alguien acaba de asignarfoo = None
, podría pensar que fue un código muerto. Pero instantáneamente sé lo que alguien que codificadel foo
estaba tratando de hacer.fuente
del
usado en cálculos intensivos en memoria, pero cuando lo vi me di cuenta de inmediato por qué era necesario.del
para señalar la intención (ya que un comentario podría hacer lo mismo sin agregar al lenguaje), pero supongo que esa es la mejor respuesta.len()
función de la misma manera. Si este es el caso, la pregunta puede haberse cerrado como opinión o incluso basada en el gusto. Python simplemente tiende a proporcionar primitivas para operaciones básicas en lugar de depender de métodos.Hay esta parte de lo que
del
hace (de la Referencia del lenguaje Python ):Asignar
None
a un nombre no elimina el enlace del nombre del espacio de nombres.(Supongo que podría haber algún debate sobre si eliminar un enlace de nombre es realmente útil , pero esa es otra pregunta).
fuente
del
elimina un enlace de nombre, ya que sugirió asignarNone
como alternativa.NameError
. Greg Hewgill hace esta distinción. Y es esta distinción la que hace que su afirmación de lo que el cartel "claramente" entendió no me resulta clara.Un lugar que he encontrado
del
útil es limpiar variables extrañas en bucles for:Ahora puede estar seguro de que x estará indefinido si lo usa fuera del ciclo for.
fuente
del
supone que su línea aquí tiene sangría (es decir, parte del bucle)?NameError: name 'x' is not defined
si la lista está vacía.Eliminar una variable es diferente a establecerla en Ninguno
Eliminar nombres de variables con
del
es probablemente algo que se usa raramente, pero es algo que no podría lograrse trivialmente sin una palabra clave. Si puede crear un nombre de variable escribiendoa=1
, es bueno que, en teoría, pueda deshacerlo eliminando a.Puede facilitar la depuración en algunos casos, ya que intentar acceder a una variable eliminada generará un NameError.
Puede eliminar atributos de instancia de clase
Python te permite escribir algo como:
Si elige agregar atributos dinámicamente a una instancia de clase, ciertamente desea poder deshacerlo escribiendo
fuente
Hay un ejemplo específico de cuándo debe usar
del
(puede haber otros, pero sé de esto de antemano) cuando está usandosys.exc_info()
para inspeccionar una excepción. Esta función devuelve una tupla, el tipo de excepción que se generó, el mensaje y un rastreo.Los dos primeros valores suelen ser suficientes para diagnosticar un error y actuar en consecuencia, pero el tercero contiene toda la pila de llamadas entre el lugar donde se produjo la excepción y donde se detecta la excepción. En particular, si haces algo como
el rastreo,
tb
termina en los locales de la pila de llamadas, creando una referencia circular que no se puede recolectar basura. Por lo tanto, es importante hacer:para romper la referencia circular. En muchos casos en los que desea llamar
sys.exc_info()
, como con la metaclase mágica, el rastreo es útil, por lo que debe asegurarse de limpiarlo antes de que pueda dejar el controlador de excepciones. Si no necesita el rastreo, debe eliminarlo de inmediato, o simplemente hacer:Para evitarlo todo junto.
fuente
Solo otro pensamiento.
Al depurar aplicaciones http en framework como Django, la pila de llamadas llena de variables inútiles y en mal estado utilizadas anteriormente, especialmente cuando es una lista muy larga, podría ser muy dolorosa para los desarrolladores. entonces, en este punto, el control del espacio de nombres podría ser útil.
fuente
Usar "del" explícitamente también es una mejor práctica que asignar una variable a None. Si intenta eliminar una variable que no existe, obtendrá un error de tiempo de ejecución, pero si intenta establecer una variable que no existe en None, Python establecerá silenciosamente una nueva variable en None, dejando la variable quería borrado donde estaba. Así que del te ayudará a detectar tus errores antes
fuente
Para agregar algunos puntos a las respuestas anteriores:
del x
La definición de
x
indicar -> o
(una referencia quer
apunta a un objetoo
) perodel x
cambia enr
lugar deo
. Es una operación en la referencia (puntero) para objetar en lugar del objeto asociadox
. Distinguir entrer
yo
es clave aquí.locals()
.globals()
six
pertenece allí.x
pertenece, no a dóndex
apunta. El único cambio físico en la memoria es este. Por ejemplo, six
está en un diccionario o lista, se elimina (como referencia) de allí (y no necesariamente del grupo de objetos). En este ejemplo, el diccionario al que pertenece es el marco de pila (locals()
), que se superpone conglobals()
.fuente
Forzar el cierre de un archivo después de usar numpy.load:
Tal vez sea un nicho de uso, pero lo encontré útil al usar
numpy.load
para leer un archivo. De vez en cuando, actualizaba el archivo y necesitaba copiar un archivo con el mismo nombre en el directorio.Solía
del
liberar el archivo y permitirme copiar en el nuevo archivo.Tenga en cuenta que quiero evitar el
with
administrador de contexto ya que estaba jugando con tramas en la línea de comando y no quería presionar mucho la pestaña.Ver esta pregunta
fuente
__del__()
se llama al método en los objetos basura o incluso si se llama en absoluto. Por lo tanto, las API que no ofrecen ninguna forma de liberar recursos más que esperar que el__del__()
método se llame algún tiempo (poco después de que el objeto sea basura) se rompen hasta cierto punto.del
A menudo se ve en los__init__.py
archivos. Cualquier variable global que se define en un__init__.py
archivo se "exporta" automáticamente (se incluirá en afrom module import *
). Una forma de evitar esto es definir__all__
, pero esto puede ser complicado y no todos lo usan.Por ejemplo, si tuviera código
__init__.py
comoEntonces su módulo exportaría el
sys
nombre. En su lugar deberías escribirfuente
Como ejemplo de lo que
del
se puede usar, me resulta útil en situaciones como esta:Estas dos funciones pueden estar en diferentes paquetes / módulos y el programador no necesita saber qué argumento valor predeterminado
c
enf
realidad tienen. Entonces, al usar kwargs en combinación con del, puede decir "Quiero el valor predeterminado en c" configurándolo en Ninguno (o en este caso también dejarlo).Podrías hacer lo mismo con algo como:
Sin embargo, el ejemplo anterior me parece más SECO y elegante.
fuente
Puede usarlo para eliminar un solo elemento de una matriz en lugar de la sintaxis de corte
x[i:i+1]=[]
. Esto puede ser útil si, por ejemplo, está enos.walk
y desea eliminar un elemento en el directorio. Sin embargo, no consideraría que una palabra clave sea útil para esto, ya que uno podría hacer un[].remove(index)
método (el.remove
método es en realidad buscar y eliminar la primera instancia de valor).fuente
[].pop(index)
y[].remove(item)
. No use la variable nombrada"index"
cuando se habla de valor, lo hace parecer confuso.He encontrado
del
que es útil para la gestión de memoria pseudo-manual cuando se manejan datos grandes con Numpy. Por ejemplo:Esta puede ser la diferencia entre detener un script cuando el sistema cambia como loco cuando el Python GC no puede seguir el ritmo, y se ejecuta perfectamente por debajo de un umbral de memoria suelto que deja mucho margen para usar la máquina para navegar y codificar mientras funciona.
fuente
Creo que una de las razones por las que del tiene su propia sintaxis es que reemplazarla con una función podría ser difícil en ciertos casos dado que opera en el enlace o variable y no en el valor al que hace referencia. Por lo tanto, si se creara una versión de función de del, se tendría que pasar un contexto. y menos legible. Todavía digo que deshacerse de Del sería bueno dado su uso aparentemente raro. Pero eliminar las características / defectos del lenguaje puede ser doloroso. Tal vez Python 4 lo eliminará :)
fuente
Me gustaría profundizar en la respuesta aceptada para resaltar el matiz entre establecer una variable en lugar de
None
eliminarla condel
:Dada la variable
foo = 'bar'
, y la siguiente definición de función:Una vez declarado inicialmente,
test_var(foo)
rindevariable tested true
como se esperaba.Ahora intenta:
que rinde
variable tested false
.Contraste este comportamiento con:
que ahora se levanta
NameError: name 'foo' is not defined
.fuente
Otro uso de nicho: en pyroot con ROOT5 o ROOT6, "del" puede ser útil para eliminar un objeto de python que hace referencia a un objeto C ++ que ya no existe. Esto permite que la búsqueda dinámica de pyroot encuentre un objeto C ++ con un nombre idéntico y lo una al nombre de python. Entonces puede tener un escenario como:
Con suerte, este nicho se cerrará con la gestión de objetos más sensata de ROOT7.
fuente
El comando "del" es muy útil para controlar datos en una matriz, por ejemplo:
Salida:
['B', 'C', 'D']
fuente
Una vez que tuve que usar:
porque usando solo:
no liberó el puerto serie lo suficientemente rápido como para abrirlo nuevamente de inmediato. De esa lección aprendí que
del
realmente significaba: "¡GC esto AHORA! Y espera hasta que termine" y eso es realmente útil en muchas situaciones. Por supuesto, puede tener unsystem.gc.del_this_and_wait_balbalbalba(obj)
.fuente
__del__()
siempre está mal en Python (sin embargo, no sé los motivos de este diseño) y es mejor usar la API de administrador de contexto (lawith
declaración).serial
módulo también funciona con Jython, por lo que su truco no funciona allí!del es el equivalente de "desarmado" en muchos idiomas y como punto de referencia cruzada al pasar de otro idioma a python ... las personas tienden a buscar comandos que hacen lo mismo que solían hacer en su primer idioma ... también configurando una var a "" o none realmente no elimina la var del alcance ... solo vacía su valor, el nombre de la var en sí misma todavía se almacenaría en la memoria ... ¿por qué? en una secuencia de comandos de memoria intensiva ... mantener la basura detrás de su no un no y de todos modos ... cada idioma tiene alguna forma de una función var "unset / delete" ... ¿por qué no Python?
fuente
del
no invoca al recolector de basura más rápido que= None
, ni dejará basura a la larga. Es posible que desee aprovechar la recolección de basura de Python.Cada objeto en python tiene un identificador, Tipo, recuento de referencia asociado, cuando usamos del recuento de referencia se reduce, cuando el recuento de referencia se convierte en cero, es un candidato potencial para la recolección de basura. Esto diferencia el del cuando se compara con establecer un identificador en Ninguno. En el caso posterior, simplemente significa que el objeto se deja fuera (hasta que estemos fuera del alcance, en cuyo caso se reduce el recuento) y simplemente ahora el punto de identificación a otro objeto (ubicación de memoria).
fuente