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



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



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

764   6  

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

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

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

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

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

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

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

пространство имен IPython также можно сбросить с помощью команды magic %reset -f. (Тег -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.

Comments

    Ничего не найдено.