Как очистить все переменные в середине Python script?
Я ищу что-то похожее на "clear" в Matlab: команда/функция, которая удаляет все переменные из рабочей области, освобождая их из системной памяти. Есть ли такая вещь в Python?
EDIT: я хочу написать script, который в какой-то момент очищает все переменные.
Ответы
Ответ 1
Следующая последовательность команд удаляет каждое имя из текущего модуля:
>>> 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
каждый раз), поэтому было бы лучше назвать что управляющая переменная _
, например, для четкого отображения "it special" (плюс, в интерактивном интерпретаторе имя _
переписывается в любом случае после каждого полного выражения, введенного в приглашении, до значения этого выражения, поэтому он не будет долго задерживаться, -).
В любом случае, как только вы определили, что именно вы хотите сделать, нетрудно определить функцию для этой цели и поместить ее в ваш загрузочный файл (если вы хотите его только в интерактивных сеансах) или на сайте, настроить файл (если вы хотите его в каждом script).
Ответ 2
Нет, вам лучше всего перезапустить интерпретатор
Ipython является отличной заменой сложного интерпретатора и имеет команду %reset
, которая обычно работает
Ответ 3
Если вы пишете функцию, то после ее выхода все имена внутри исчезают.
Концепция называется пространством имен, и она настолько хороша, что превратила ее в дзен Python:
Пространства имен - это одна из отличных идей - давайте делать больше таких!
Пространство имен IPython также может быть сброшено с помощью волшебной команды %reset -f
. (-f
означает "сила"; другими словами, "не спрашивайте меня, действительно ли я хочу удалить все переменные, просто сделайте это".)
Ответ 4
from IPython import get_ipython;
get_ipython().magic('reset -sf')
Ответ 5
Это модифицированная версия ответа Алекса.
Мы можем сохранить состояние пространства имен модулей и восстановить его, используя следующие 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() будет работать так же, как и в режиме Matlab.
Ответ 6
В Spyder можно настроить консоль IPython для каждого файла Python, чтобы очистить все переменные перед каждым выполнением в меню Run → Configuration → General settings → Remove all variables before execution
.
Ответ 7
В незанятой IDE есть Shell/Restart Shell. Cntrl-F6 сделает это.
Ответ 8
for i in list(globals().keys()):
exec('del {}'.format(i)) if i[0] != '_' else None