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

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

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

71
задан snakile 22 August 2010 в 23:30
поделиться

3 ответа

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

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

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

53
ответ дан 24 November 2019 в 13:00
поделиться

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

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

50
ответ дан 24 November 2019 в 13:00
поделиться

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

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

Пространства имен - одна отличная идея - давай сделаем еще!

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

26
ответ дан 24 November 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: