Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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