¿Hay alguna manera de borrar el valor de una variable en python?
Por ejemplo, si estaba implementando un árbol binario:
Class Node:
self.left = somenode1
self.right = somenode2
Si quisiera eliminar algún nodo del árbol, tendría que configurarlo self.left
para vaciarlo.
Respuestas:
¿Qué tiene de malo
self.left = None
?fuente
null
en PHP, ya que establecer una variablenull
en PHP te da un comportamiento similar en la mayoría de los casos como si no lo hubieras definido en primer lugar. Un valor deNone
en Python es bastante diferente de una variable indefinida. Sin embargo,None
es bastante parecido a la mayoría de las otras encarnacionesnull
(hasta que entremos en detalles más arcanos, al menos).None
que pueda hacer con cualquier otro objeto "simple" de tipo no especificado: guárdelo en contenedores, imprima una representación de cadena, verifique algunos metadatos en él ... De todos modos, ¿intentó con Google "python null"? equivalente"? Lo digo en serio; tomará un poco de análisis, pero la información está ahí.print x
y presione enter. Esto producirá un error de intérprete, al igual que la mayoría de los idiomas cuando intenta imprimir una variable indefinida. Pero si define la variable y luego trata de borrarla con None, el uso delprint x
código producirá la palabraNone
como salida. Soy nuevo en Python, así que podría estar equivocado, pero esto no parece ser el comportamiento de una variable borrada.La
del
palabra clave haría.Pero en este caso voto por
self.left = None
fuente
del
También tiene la desventaja de que si intenta eliminar una variable que no existe, arroja una excepción, que generalmente no es deseable.type=…
cuando querías escribir ytype(…)
luego borrarlos, es la forma más fácil de recuperar la funcionalidad original. Es decir, si lo mantiene como Ninguno, seguirá cortando el acceso a la función subyacente.set = set(myList)
y luego me di cuenta de que ya no podía usar set como una función (doh). El usodel set
me permitió usarlo nuevamente como fx. Por supuesto, nunca usaría esa var reservada en un script real.var = None
"borra el valor", estableciendo el valor de la variable en "nulo" como el valor de "Ninguno", sin embargo, el puntero a la variable permanece.del var
elimina totalmente la definición de la variable.En caso de que desee utilizar la variable más adelante, por ejemplo, establecer un nuevo valor para ella, es decir, retener la variable,
None
sería mejor.fuente
En realidad, eso no elimina la variable / propiedad. Todo lo que hará es establecer su valor en
None
, por lo tanto, la variable todavía ocupará espacio en la memoria. Si desea borrar por completo toda la existencia de la variable de la memoria, puede simplemente escribir:fuente
clear
noremove
. del matará el atributo y las búsquedas. Es mucho más limpio establecerlo en Ninguno, de lo que puede verificarif self.left
y eso sería lo suficientemente bueno como para verificar si un nodo está vacío.del
, en mi humilde opinión, es más obvio que la variable puede olvidarse cuando se analiza mentalmente ' el código.if self.left:
o prefiere lidiar con una posible excepción de NameError que bloqueará su programa si no lo maneja en todas partes? ?Si desea eliminarlo por completo use
del
:del your_variable
O de lo contrario, para hacer el valor
None
:your_variable = None
Si es iterable (como una lista o tupla), puede dejarlo vacío como:
your_variable.clear()
Entonces
your_variable
estará vacíofuente
¿Quieres eliminar una variable, no?
ok, creo que tengo una mejor idea alternativa para responder @bnul:
Puede eliminar nombres individuales con
del
:del x
o puede eliminarlos del objeto globals ():for name in dir(): if not name.startswith('_'): del globals()[name]
Este es solo un ejemplo de bucle; a la defensiva solo elimina nombres que no comienzan con un guión bajo, haciendo una suposición (no irrazonable) de que solo usó nombres sin guión bajo al comienzo en su intérprete. En su lugar, podría utilizar una lista codificada de nombres para mantener (lista blanca) si realmente quisiera ser exhaustivo. No hay una función integrada para hacer la limpieza por usted, aparte de simplemente salir y reiniciar el intérprete.
Los módulos que ha importado (import os) permanecerán importados porque sys.modules hace referencia a ellos; las importaciones posteriores reutilizarán el objeto del módulo ya importado. Simplemente no tendrá una referencia a ellos en su espacio de nombres global actual.
¡Por favor reconsidere esta respuesta!
fuente
Utilicé algunas opciones mencionadas anteriormente:
o establecer el valor en Ninguno usando
Es importante conocer las diferencias y establecer algunos manejadores de excepciones cuando use establecer el valor en Ninguno. Si está imprimiendo el valor de las declaraciones condicionales usando una plantilla, digamos,
puede ver el valor de la variable imprimiendo "El valor de la variable es Ninguno". Por lo tanto, tendría que poner algunos manejadores de excepciones allí:
El comando anterior solo imprimirá valores si self.left no es
None
fuente