Я шукаю щось подібне до "clear" у Matlab: команда / функція, яка видаляє всі змінні з робочої області, звільняючи їх із системної пам'яті. Чи існує така річ у Python?
EDIT: Я хочу написати сценарій, який у певний момент очистить всі змінні.
Я шукаю щось подібне до "clear" у 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кожного разу перезаписується в реченні), тому, можливо, буде краще назвати цю змінну управління _, наприклад, щоб чітко показати "це спеціальний "(плюс, в інтерактивному інтерпретаторі ім'я _все одно перев'язується після кожного повного виразу, введеного в підказці, до значення цього виразу, тому воно не буде триматися довго ;-)
У всякому разі, як тільки ви визначили , що саме це є ви хочете зробити, це не важко визначити функцію для цієї мети і покласти його в файл для запуску (якщо ви хочете його тільки в інтерактивних сесіях) або файл сайт-підганяє ( якщо це потрібно у кожному сценарії).
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 () буде працювати як matlab's clear.
names = list(sys.modules[__name__].__dict__.keys()), інакше Python скаржиться на те, що ви змінили розмір словника під час ітерації через його dict_keysоб’єкт.
importвідповісти на цю відповідь (тобто я це зберег і імпортую з блокнота Jupyter, щоб очистити простір імен між різними проблемами в домашньому завданні), я думаю, ви захочете використовувати "__main__"замість __name__.
globals()Функція повертає словник, де ключі є іменами об'єктів , які ви можете назвати (і цінність, до речі, є ids цих об'єктів) exec()функція приймає рядок і виконує її , як якщо б ви просто наберіть в консолі пітона. Отже, код є
for i in list(globals().keys()):
if(i[0] != '_'):
exec('del {}'.format(i))
У простої IDE є оболонка / перезапуск оболонки. Cntrl-F6 зробить це.