Szukam czegoś podobnego do 'wyczyść' w Matlabie: Polecenie / funkcja, która usuwa wszystkie zmienne z obszaru roboczego, zwalniając je z pamięci systemu. Czy jest coś takiego w Pythonie?
EDYCJA: Chcę napisać skrypt, który w pewnym momencie czyści wszystkie zmienne.
del
, gdy skończysz. Jeśli po prostu martwisz się, że przestrzeń nazw jest zagracona, prawdopodobnie powinieneś ponownie rozważyć swój projekt, używając tak wielu nazw. Na przykład w przypadku serii przekształceń obrazu zachowanie każdego pośredniego kroku jest prawdopodobnie niepotrzebne.Odpowiedzi:
Poniższa sekwencja poleceń usuwa wszystkie nazwy z bieżącego modułu:
>>> import sys >>> sys.modules[__name__].__dict__.clear()
Wątpię, czy naprawdę chcesz to zrobić, ponieważ „każde imię” zawiera wszystkie wbudowane elementy, więc po takim całkowitym wymazaniu niewiele możesz zrobić. Pamiętaj, że w Pythonie tak naprawdę nie ma czegoś takiego jak „zmienna” - istnieją obiekty różnego rodzaju (w tym moduły, funkcje, klasy, liczby, łańcuchy znaków, ...) i są nazwy powiązane z obiektami; sekwencja usuwa każdą nazwę z modułu (odpowiednie obiekty znikają wtedy i tylko wtedy, gdy wszystkie odniesienia do nich zostały właśnie usunięte).
Może chcesz być bardziej selektywny, ale trudno odgadnąć, co masz na myśli, chyba że chcesz być bardziej szczegółowy. Ale żeby podać przykład:
>>> import sys >>> this = sys.modules[__name__] >>> for n in dir(): ... if n[0]!='_': delattr(this, n) ... >>>
Ta sekwencja pozostawia same nazwy, które są prywatne lub magiczne, w tym
__builtins__
nazwę specjalną, która zawiera wszystkie wbudowane nazwy. Tak więc wbudowane nadal działają - na przykład:>>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'n'] >>>
Jak widzisz, nazwa
n
(w tym zmienna kontrolnafor
) również się trzyma (ponieważ jest ponownie wiązana wfor
klauzuli za każdym razem), więc może lepiej nazwać tę zmienną kontrolną_
, na przykład, aby wyraźnie pokazać special "(dodatkowo w interaktywnym interpretatorze nazwa i tak_
jest ponownie wiązana po każdym pełnym wyrażeniu wprowadzonym w znaku zachęty, do wartości tego wyrażenia, więc nie będzie trwało długo ;-).W każdym razie, kiedy już dokładnie określić, co to jest chcesz zrobić, to nie jest trudne do zdefiniowania funkcji do celów i umieścić go w pliku startowego (jeśli chcesz go tylko w sesjach interaktywnych) lub plik site-Dostosuj ( jeśli chcesz to w każdym skrypcie).
źródło
int = (2).__class__
,str = ''.__class__
,True = (1 == 1)
etc ...for n in dir(): ... if n[0]!='_': delattr(this, n)
w pewnym momencien=this
i usuwasz go w pętli! Więc przy następnej iteracjidelattr(this,n)
pojawi się błąd Error probing, ponieważ właśnie go usunąłeś! :) Więc to nie działa poprawnieNie, najlepiej jest zrestartować tłumacza
IPython jest doskonałym zamiennikiem dołączonego interpretera i ma
%reset
polecenie, które zwykle działaźródło
ctrl-d
zanimpyt
->tab
wrócę do tłumacza. Nie ma powodu, żeby robić tu coś wymyślnego.%reset -f
aby nie być interaktywnym. stackoverflow.com/questions/38798181/…Jeśli napiszesz funkcję, po jej pozostawieniu wszystkie nazwy wewnątrz znikną.
Pojęcie to nazywa się przestrzenią nazw i jest tak dobre, że stało się zen Pythona :
Przestrzeń nazw IPythona można również zresetować za pomocą polecenia magic
%reset -f
. (-f
Oznacza „wymuszenie”; innymi słowy: „nie pytaj mnie, czy naprawdę chcę usunąć wszystkie zmienne, po prostu zrób to”).źródło
from IPython import get_ipython; get_ipython().magic('reset -sf')
źródło
%reset -sf
To jest zmodyfikowana wersja odpowiedzi Alexa. Możemy zapisać stan przestrzeni nazw modułu i przywrócić go za pomocą następujących 2 metod ...
__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
Możesz także dodać wiersz „clear = restoreContext” przed wywołaniem metody saveContext (), a funkcja clear () będzie działać jak metoda clear w programie Matlab.
źródło
names = list(sys.modules[__name__].__dict__.keys())
, w przeciwnym razie Python będzie narzekał, że zmieniłeś rozmiar słownika podczas iteracji przez jegodict_keys
obiekt.import
tej odpowiedzi (tj. Mam to zapisane i importuję to z notatnika Jupyter, aby wyczyścić przestrzeń nazw między różnymi problemami w zadaniu domowym), myślę, że będziesz chciał użyć"__main__"
zamiast__name__
.W Spyder można skonfigurować konsolę IPython dla każdego pliku Pythona, aby wyczyścić wszystkie zmienne przed każdym wykonaniem w Menu
Run -> Configuration -> General settings -> Remove all variables before execution
.źródło
globals()
Zwraca słownik, gdzie klucze są nazwami przedmiotów można Nazwisko (i wartości, nawiasem mówiąc, sąid
s tych obiektów)exec()
funkcja przyjmuje ciąg i wykonuje go tak, jakby po prostu wpisz go w konsoli Pythona. Tak więc kod jestfor i in list(globals().keys()): if(i[0] != '_'): exec('del {}'.format(i))
źródło
W bezczynnym IDE jest Shell / Restart Shell. Cntrl-F6 zrobi to.
źródło
Czy nie jest najłatwiejszym sposobem na utworzenie klasy zawierającej wszystkie potrzebne zmienne? Zatem masz jeden obiekt ze wszystkimi zmiennymi curretn i jeśli potrzebujesz, możesz nadpisać tę zmienną?
źródło