Borrar variable en python

Respuestas:

157

¿Qué tiene de malo self.left = None?

bnaul
fuente
19
No estoy familiarizado con la palabra clave None. ¿Es esto similar a nulo en otros idiomas?
Bnicholas
66
Si; Es equivalente a nulo.
Smashery el
12
@Bnicholas Sin embargo, no es como nullen PHP, ya que establecer una variable nullen PHP te da un comportamiento similar en la mayoría de los casos como si no lo hubieras definido en primer lugar. Un valor de Noneen Python es bastante diferente de una variable indefinida. Sin embargo, Nonees bastante parecido a la mayoría de las otras encarnaciones null(hasta que entremos en detalles más arcanos, al menos).
Ben
No es una palabra clave; es un nombre establecido por defecto para un objeto incorporado. Puede hacer cualquier cosa Noneque 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í.
Karl Knechtel el
18
Abra la terminal de Python y escriba print xy 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 del print xcódigo producirá la palabra Nonecomo salida. Soy nuevo en Python, así que podría estar equivocado, pero esto no parece ser el comportamiento de una variable borrada.
Musixauce3000
408

La delpalabra clave haría.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Pero en este caso voto por self.left = None

starrify
fuente
18
a veces esto no lo elimina por completo, solo elimina esa referencia a un en memoria. Esto puede dejar variables fantasmas en la memoria que no obtienen gc.
Jakob Bowyer
44
delTambién tiene la desventaja de que si intenta eliminar una variable que no existe, arroja una excepción, que generalmente no es deseable.
Philip Kearns
33
Solo quería señalar que si accidentalmente declaraste una variable que está sobrescribiendo los comandos integrados, por ejemplo, type=… cuando querías escribir y type(…)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.
mpacer
2
Recolección de basura / recolector / recolectado
mccc
1
Este era el que estaba buscando. Jugando en la línea cmd, tuve ... set = set(myList)y luego me di cuenta de que ya no podía usar set como una función (doh). El uso del setme permitió usarlo nuevamente como fx. Por supuesto, nunca usaría esa var reservada en un script real.
jbchurchill
111

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, Nonesería mejor.

usuario11788
fuente
¿Qué pasa si quiero eliminar completamente la variable que en algunas circunstancias no existe? ¿Hay algún parámetro para evitar un error? Necesito eliminar varias variables: del a, b, c, d Podría usar loop e try / except, pero prefiero algún interruptor para evitarlo.
Tedo Vrbanec
63

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:

del self.left
Viraj Shah
fuente
8
No entiendo por qué la respuesta = Ninguno es tan popular. Esta es la respuesta correcta
Nikolay Gromov
1
El OP dijo que clearno remove. del matará el atributo y las búsquedas. Es mucho más limpio establecerlo en Ninguno, de lo que puede verificar if self.lefty eso sería lo suficientemente bueno como para verificar si un nodo está vacío.
user1767754
"Es mucho más limpio establecerlo en Ninguno". Vale la pena considerar que si alguien (usted mismo algún tiempo después o un colaborador) está leyendo el código del, en mi humilde opinión, es más obvio que la variable puede olvidarse cuando se analiza mentalmente ' el código.
Bolsillos y
1
@NikolayGromov en su código del día a día, cuando desea obtener el valor de self.left, ¿prefiere verificar if self.left:o prefiere lidiar con una posible excepción de NameError que bloqueará su programa si no lo maneja en todas partes? ?
Pierre.Sassoulas el
33
  • Si desea eliminarlo por completo use del:

    del your_variable

  • O de lo contrario, para hacer el valorNone :

    your_variable = None

  • Si es iterable (como una lista o tupla), puede dejarlo vacío como:

    your_variable.clear()

Entonces your_variableestará vacío

U10-Adelante
fuente
Para la segunda opción, "borrar su contenido" no es correcto, esto solo reasignará la variable a Ninguno, el objeto original aún permanecerá (a menos que su recuento de referencia se reduzca a cero en cuyo caso se recolecta basura).
cs95
0

¿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!

Federico Migueletto
fuente
-1

Utilicé algunas opciones mencionadas anteriormente:

del self.left

o establecer el valor en Ninguno usando

self.left = None

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,

print("The value of the variable is {}".format(self.left))

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í:

if self.left:
    #Then only print stuff

El comando anterior solo imprimirá valores si self.left no es None

Navneet Kumar
fuente