2010-08-22 9 views
45

Estoy buscando algo similar a 'borrar' en Matlab: un comando/función que elimina todas las variables del espacio de trabajo, liberándolas de la memoria del sistema. ¿Hay algo así en Python?¿Cómo elimino todas las variables en medio de un script de Python?

EDIT: Quiero escribir un script que en algún momento borre todas las variables.

+1

Te será útil si cambiaste tu título a algo así como "¿Cómo elimino todas las variables en medio de una secuencia de comandos de Python?" para futuras búsquedas sobre el tema, porque "¿Cómo reiniciar la ventana de comandos en Python?" no tiene nada que ver con lo que realmente estás preguntando. – sdolan

+0

@sdolan changed – snakile

+0

¿Puede proporcionarnos algún contexto posible en el que esto tenga sentido? –

Respuesta

34

La siguiente secuencia de comandos no eliminar cada nombre el módulo actual:

>>> import sys 
>>> sys.modules[__name__].__dict__.clear() 

Dudo que realmente quiero hacer esto, porque "todo nombre" incluye todas Buil T-ins, por lo que no hay mucho que pueda hacer después de una eliminación total. Recuerde, en Python no existe realmente una "variable": hay objetos, de muchos tipos (incluidos módulos, funciones, clases, números, cadenas, ...), y hay nombres, atada a objetos; lo que hace la secuencia es eliminar cada nombre de un módulo (los objetos correspondientes desaparecen si y solo si cada referencia a ellos acaba de ser eliminada).

Quizás quieras ser más selectivo, pero es difícil adivinar exactamente a qué te refieres a menos que quieras ser más específico. Pero, sólo para dar un ejemplo:

>>> import sys 
>>> this = sys.modules[__name__] 
>>> for n in dir(): 
... if n[0]!='_': delattr(this, n) 
... 
>>> 

Esta secuencia deja solos nombres que son privadas o mágico, incluyendo el nombre especial __builtins__ que alberga todos los incorporados en los nombres. Así, muebles empotrados todavía funcionan - por ejemplo:

>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'n'] 
>>> 

Como se puede ver, el nombre n (la variable de control en el que for) también pasa a quedarse (como se le re-ligada en el for cláusula cada vez hasta), por lo que podría ser mejor nombrar esa variable de control _, por ejemplo, para mostrar claramente "es especial" (además, en el intérprete interactivo, el nombre _ se vuelve a enlazar de todos modos después de cada expresión completa ingresada en el indicador, el valor de esa expresión, por lo que no se mantendrá durante mucho tiempo ;-).

De todos modos, una vez que haya determinado exactamente lo que es que quiere hacer, no es difícil de definir una función para el propósito y lo puso en su archivo de puesta en marcha (si quieres que sólo en sesiones interactivas) o archivo de personalización del sitio (si lo desea en cada secuencia de comandos).

+2

Bueno, siempre puedes guardar una copia del diccionario original al inicio y luego eliminar los nombres que se han agregado;) Sin embargo, creo que esto es un claro abuso del sistema dinámico, y no puedo pensar en una situación inútil para haz esto en. – monoceres

+3

Tienes razón. No debería hacer esto. Gracias. – snakile

+2

Jaja, esto es brillante ... Es sorprendente la cantidad de funcionalidad que se pierde al hacer esto, y sin embargo, cuánta funcionalidad se puede recuperar haciendo cosas como 'int = (2) .__ class__',' str = '' .__ class__ ',' True = (1 == 1) 'etc ... –

35

No, usted es el mejor de reiniciar el intérprete

Ipython es un excelente reemplazo para el intérprete incluido y tiene el comando %reset que por lo general funciona

+0

Por 'No' quieres decir que no debería hacerlo o que es imposible? Si dices que no debería hacerlo, ¿podrías explicar por qué? – snakile

+4

+1: Se necesita menos de un cuarto de segundo para 'ctrl-d' luego' pyt'-> 'tab' para volver al intérprete. No hay razón para hacer algo elegante aquí. – sdolan

+1

% de restablecimiento funciona para la mayoría de las variables, para algunos no. Para mí, solo reiniciar el intérprete garantiza limpiar todo. –

22

Si escribe una función, una vez que la deja, todos los nombres desaparecen.

El concepto se llama namespace y es tan bueno, que lo hizo en el Zen of Python:

espacios de nombres se tocando la bocina una gran idea - vamos a hacer más de esos!

El espacio de nombres de IPython también se puede restablecer con el comando mágico %reset -f.(El -f significa "fuerza"; en otras palabras, "no me preguntes si realmente quiero eliminar todas las variables, simplemente hazlo")

2

Esta es una versión modificada de la respuesta de Alex. Podemos guardar el estado del espacio de nombres de un módulo y recuperarlos utilizando los métodos siguientes 2 ...

__saved_context__ = {} 

def saveContext(): 
    import sys 
    __saved_context__.update(sys.modules[__name__].__dict__) 

def restoreContext(): 
    import sys 
    names = sys.modules[__name__].__dict__.keys() 
    for n in names: 
     if n not in __saved_context__: 
      del sys.modules[__name__].__dict__[n] 

saveContext() 

hello = 'hi there' 
print hello    # prints "hi there" on stdout 

restoreContext() 

print hello    # throws an exception 

También puede agregar una línea "clara = restoreContext" antes de llamar saveContext() y claro() lo hará trabaje como Matlab es claro.

+0

¡Excelente respuesta! Creo que para Python 3 querrás modificar restoreContext con 'names = list (sys.modules [__ name __] .__ dict __. Keys())', de lo contrario, Python se quejará de que has cambiado el tamaño del diccionario mientras iteras a través de ' Objeto dict_keys' –

+0

Además, para aquellos que quieran 'importar' esta respuesta (es decir, tengo esta guardada y la importo de un cuaderno Jupyter para borrar el espacio de nombres entre diferentes problemas en una tarea), creo que querrás usar' " __main __ "' en lugar de '__name__'. –

Cuestiones relacionadas