Как очистить все переменные в середине скрипта Python?

Я ищу что-то похожее на "clear" в Matlab: команда/функция, которая удаляет все переменные из рабочей области, освобождая их из системной памяти. Есть такая вещь в Python?

EDIT: я хочу написать сценарий, который в какой-то момент очищает все переменные.

6 ответов


следующая последовательность команд удаляет каждый name из текущего модуля:

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

Я сомневаюсь, что вы на самом деле хотите это сделать, потому что "каждое имя" включает в себя все встроенные, поэтому вы мало что можете сделать после такого полного уничтожения. Помните, что в Python действительно нет такой вещи, как "переменная" -- есть объекты, много видов (включая модули, функции, класс, номера, строки,...), и есть имена, привязанный к объектам; последовательность удаляет каждое имя из модуля (соответствующие объекты исчезают, если и только если каждая ссылка на них только что была удалена).

возможно, вы хотите быть более избирательным, но трудно точно угадать, что вы имеете в виду, если вы не хотите быть более конкретным. Но, чтобы привести пример:

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

эта последовательность оставляет только имена, которые являются частными или магическими, включая __builtins__ специальное название, которое дома со встроенными названиями. Итак, встроенные модули все еще работают - например:

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

Как видите, имя n (управляющая переменная в этой for) также случается придерживаться (как это повторно связано в for предложение каждый раз через), поэтому может быть лучше назвать эту переменную управления _, например, чтобы четко показать " это особенное "(плюс, в интерактивном интерпретаторе, имя _ повторно привязывается в любом случае после каждого полного выражения, введенного в приглашение, к значение этого выражения, поэтому оно не будет оставаться долго; -).

в любом случае, как только вы точно определили, что это is вы хотите сделать, нетрудно определить функцию для этой цели и поместить ее в файл запуска (если вы хотите ее только в интерактивных сеансах) или файл настройки сайта (если вы хотите ее в каждом скрипте).


нет, вам лучше перезапустить интерпретатор

оболочкой IPython является отличной заменой для интерпретатора в комплекте и имеет , которые, как правило, работает


Если вы пишете функцию, то, как только вы оставите ее, все имена внутри исчезнут.

концепция называется пространство имен и это так хорошо, он сделал это в Дзен питона:

пространства имен - одна отличная идея -- давай сделаем еще!

пространство имен IPython также может быть сброшено с помощью команды magic%reset -f. (The -f означает "сила"; другими словами, " Не спрашивайте меня, действительно ли я хочу чтобы удалить все переменные, просто сделайте это.")


Это модифицированная версия ответа Алекса. Мы можем сохранить состояние пространства имен модуля и восстановить его, используя следующие 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

вы также можете добавить строку "clear = restoreContext" перед вызовом saveContext() и clear() будет работать как clear matlab.


from IPython import get_ipython;   
get_ipython().magic('reset -sf')

в Spyder можно настроить консоль IPython для каждого файла Python, чтобы очистить все переменные перед каждым выполнением в меню Run -> Configuration -> General settings -> Remove all variables before execution.