Я ищу что-то похожее на «очистить» в Matlab: команду / функцию, которая удаляет все переменные из рабочей области, освобождая их из системной памяти. Есть ли такое в Python?
EDIT: я хочу написать сценарий, который в какой-то момент очищает все переменные.
del
это, когда закончите. Если вы просто беспокоитесь о загромождении пространства имен, вам, вероятно, следует пересмотреть свой дизайн, используя такое количество имен. Например, для серии преобразований изображения сохранение каждого промежуточного шага, вероятно, не нужно.Ответы:
Следующая последовательность команд удаляет все имена из текущего модуля:
>>> 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
предложении каждый раз), поэтому, возможно, было бы лучше назвать эту управляющую переменную_
, например, чтобы четко показать «это special "(плюс, в интерактивном интерпретаторе имя в_
любом случае повторно привязывается после каждого полного выражения, введенного в подсказке, к значению этого выражения, поэтому оно не останется в памяти надолго ;-).Во всяком случае, как только вы определили , что именно это является вы хотите сделать, это не трудно определить функцию для этой цели и положить его в файл для запуска (если вы хотите его только в интерактивных сессиях) или файл сайт-подгоняет ( если вы хотите это в каждом скрипте).
источник
int = (2).__class__
,str = ''.__class__
иTrue = (1 == 1)
т.д ...for n in dir(): ... if n[0]!='_': delattr(this, n)
в какой-то момент,n=this
а вы удаляете его в цикле! Итак, на следующей итерации вы получите ошибку при попытке,delattr(this,n)
потому что вы только что удалили ее! :) Так что не работает правильноНет, вам лучше перезапустить интерпретатор
IPython - отличная замена встроенному интерпретатору и имеет
%reset
команду, которая обычно работаетисточник
ctrl-d
затемpyt
->tab
вернуться в интерпретатор. Нет причин делать здесь что-то особенное.%reset -f
чтобы быть не интерактивным. stackoverflow.com/questions/38798181/…Если вы напишете функцию, то, как только вы ее оставите, все имена внутри исчезнут.
Эта концепция называется пространством имен, и она настолько хороша, что вошла в дзен Python :
Пространство имен IPython также можно сбросить с помощью волшебной команды
%reset -f
. (Это-f
означает «сила»; другими словами, «не спрашивайте меня, действительно ли я хочу удалить все переменные, просто сделайте это».)источник
from IPython import get_ipython; get_ipython().magic('reset -sf')
источник
%reset -sf
Это модифицированная версия ответа Алекса. Мы можем сохранить состояние пространства имен модуля и восстановить его, используя следующие 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.
источник
names = list(sys.modules[__name__].__dict__.keys())
, иначе Python будет жаловаться, что вы изменили размер словаря во время итерации по егоdict_keys
объекту.import
этот ответ (т.е. я сохранил его и импортирую из записной книжки Jupyter, чтобы очистить пространство имен между различными проблемами в домашнем задании), я думаю, вы захотите использовать"__main__"
вместо__name__
.В Spyder можно настроить консоль IPython для каждого файла Python, чтобы очищать все переменные перед каждым выполнением в меню
Run -> Configuration -> General settings -> Remove all variables before execution
.источник
globals()
Функция возвращает словарь, где ключи являются именами объектов , которые вы можете назвать (и ценность, кстати, являетсяid
s этих объектов)exec()
функция принимает строку и выполняет ее , как если бы вы просто наберите в консоли питона. Итак, кодfor i in list(globals().keys()): if(i[0] != '_'): exec('del {}'.format(i))
источник
В простаивающей IDE есть Shell / Restart Shell. Cntrl-F6 сделает это.
источник
Разве это не самый простой способ создать класс, содержащий все необходимые переменные? Тогда у вас есть один объект со всеми переменными curretn, и если вам нужно, вы можете перезаписать эту переменную?
источник