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