Как очистить все переменные в середине скрипта Python? - PullRequest
62 голосов
/ 23 августа 2010

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

РЕДАКТИРОВАТЬ: Я хочу написать скрипт, который в какой-то момент очищает все переменные.

Ответы [ 8 ]

48 голосов
/ 23 августа 2010

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

>>> 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 каждый раз через), поэтому, возможно, было бы лучше назвать эту управляющую переменную _, например, чтобы ясно показать, что она «особенная» (плюс, в интерактивном интерпретаторе имя _ повторнов любом случае после каждого полного выражения, введенного в приглашении, привязывается к значению этого выражения, чтобы оно не задерживалось на долгое время; что вы хотите сделать, нетрудно определить функцию для этой цели и поместить ее в свой стартовый файл (если вы хотите это только в интерактивных сеансах) или в файл настройки сайта (если вы хотите, чтобы это было в каждом скрипте).

47 голосов
/ 23 августа 2010

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

Ipython является отличной заменой встроенного интерпретатора и имеет команду %reset, которая обычно работает

26 голосов
/ 23 августа 2010

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

Концепция называется Пространство имен , и это так хорошо, что она превратилась в Zen of Python :

Пространства имен - это одна прекрасная идея - давайте сделаем больше таких!

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

4 голосов
/ 04 апреля 2018
from IPython import get_ipython;   
get_ipython().magic('reset -sf')
3 голосов
/ 14 сентября 2018

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

3 голосов
/ 15 февраля 2014

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

0 голосов
/ 01 апреля 2019

Функция globals() возвращает словарь, где ключами являются имена объектов, которые вы можете назвать (и, кстати, значениями являются id s этих объектов) Функция exec() принимает строку и выполняет ее какесли вы просто наберете его в консоли Python. Итак, код будет

for i in list(globals().keys()):
    exec('del {}'.format(i)) if i[0] != '_' else None

Здесь else None добавляется, чтобы следовать синтаксису Python.Этот код не выглядит красивым, но он короткий.Лучший способ написать это

for i in list(globals().keys()):
    if(i[0] != '_'):
        exec('del {}'.format(i))
0 голосов
/ 08 марта 2019

В незанятой IDE есть Shell / Restart Shell.Cntrl-F6 сделает это.

...