Estoy buscando algo similar a 'borrar' en Matlab: un comando / función que elimina todas las variables del espacio de trabajo y las libera de la memoria del sistema. ¿Existe tal cosa en Python?
EDITAR: Quiero escribir un script que en algún momento borre todas las variables.
del
usarlos cuando haya terminado. Si simplemente le preocupa que el espacio de nombres esté desordenado, probablemente debería reconsiderar su diseño usando tantos nombres. Por ejemplo, para una serie de transformaciones de imagen, es probable que no sea necesario mantener todos los pasos intermedios.Respuestas:
La siguiente secuencia de comandos elimina todos los nombres del módulo actual:
>>> import sys >>> sys.modules[__name__].__dict__.clear()
Dudo que realmente quieras hacer esto, porque "todos los nombres" incluyen todos los componentes integrados, por lo que no hay mucho que puedas hacer después de una eliminación tan total. Recuerde, en Python realmente no existe tal cosa como una "variable" - hay objetos , de muchos tipos (incluyendo módulos, funciones, clases, números, cadenas, ...), y hay nombres ligados a objetos; lo que hace la secuencia es eliminar todos los nombres de un módulo (los objetos correspondientes desaparecen si y solo si se acaba de eliminar cada referencia a ellos).
Tal vez 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, solo para dar un ejemplo:
>>> import sys >>> this = sys.modules[__name__] >>> for n in dir(): ... if n[0]!='_': delattr(this, n) ... >>>
Esta secuencia deja solo los nombres que son privados o mágicos, incluido el
__builtins__
nombre especial que alberga todos los nombres incorporados. Por lo tanto, los elementos integrados siguen funcionando, por ejemplo:>>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'n'] >>>
Como ves, nombre
n
(la variable de control en esofor
) también se mantiene (ya que se vuelve a unir en lafor
cláusula cada vez que se completa), 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 vincular de todos modos después de cada expresión completa ingresada en el indicador, al valor de esa expresión, por lo que no se quedará por mucho tiempo ;-).De todos modos, una vez que haya determinado exactamente qué es lo que desea hacer, no es difícil definir una función para el propósito y ponerla en su archivo de inicio (si lo desea solo en sesiones interactivas) o en el archivo de personalización del sitio ( si lo desea en cada guión).
fuente
int = (2).__class__
,str = ''.__class__
,True = (1 == 1)
etc ...for n in dir(): ... if n[0]!='_': delattr(this, n)
en algún momenton=this
y lo eliminas en el ciclo! Entonces, en la siguiente iteración, aparece Error al intentarlodelattr(this,n)
porque lo acaba de eliminar. :) Entonces no funciona correctamenteNo, es mejor reiniciar el intérprete
IPython es un excelente reemplazo para el intérprete incluido y tiene el
%reset
comando que generalmente funcionafuente
ctrl-d
entoncespyt
->tab
volver al intérprete. No hay razón para hacer nada elegante aquí.%reset -f
para no ser interactivo. stackoverflow.com/questions/38798181/…Si escribe una función, una vez que la deje, todos los nombres dentro desaparecerán.
El concepto se llama espacio de nombres y es tan bueno que se convirtió en el Zen de Python :
El espacio de nombres de IPython también se puede restablecer con el comando mágico
%reset -f
. (-f
Significa "forzar"; en otras palabras, "no me preguntes si realmente quiero eliminar todas las variables, simplemente hazlo").fuente
from IPython import get_ipython; get_ipython().magic('reset -sf')
fuente
%reset -sf
Esta es una versión modificada de la respuesta de Alex. Podemos guardar el estado del espacio de nombres de un módulo y restaurarlo usando los siguientes 2 métodos ...
__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 "clear = restoreContext" antes de llamar a saveContext () y clear () funcionará como clear de matlab.
fuente
names = list(sys.modules[__name__].__dict__.keys())
, de lo contrario, Python se quejará de que ha cambiado el tamaño del diccionario mientras itera a través de sudict_keys
objeto.import
esta respuesta (es decir, tengo esto guardado e importo esto desde un cuaderno de Jupyter para borrar el espacio de nombres entre diferentes problemas en una tarea), creo que querrán usar en"__main__"
lugar de__name__
.En Spyder se puede configurar la consola IPython para cada archivo Python para borrar todas las variables antes de cada ejecución en el Menú
Run -> Configuration -> General settings -> Remove all variables before execution
.fuente
La
globals()
función devuelve un diccionario, donde las claves son nombres de objetos que puede nombrar (y los valores, por cierto, sonid
s de estos objetos). Laexec()
función toma una cadena y la ejecuta como si la escribiera en una consola de Python. Entonces, el código esfor i in list(globals().keys()): if(i[0] != '_'): exec('del {}'.format(i))
fuente
En el IDE inactivo hay Shell / Restart Shell. Cntrl-F6 lo hará.
fuente
¿No es la forma más fácil de crear una clase continuando con todas las variables necesarias? Entonces tiene un objeto con todas las variables actuales, y si lo necesita, ¿puede sobrescribir esta variable?
fuente