Czy istnieje sposób na wyczyszczenie wartości zmiennej w pythonie?
Na przykład, jeśli wdrażałem drzewo binarne:
Class Node:
self.left = somenode1
self.right = somenode2
Gdybym chciał usunąć jakiś węzeł z drzewa, musiałbym ustawić self.left
puste.
Odpowiedzi:
Co jest nie tak z
self.left = None
?źródło
null
w PHP, w tym ustawieniu zmienna nanull
w PHP daje podobne zachowanie w większości przypadków, jakbyś nie zdefiniował jej w pierwszej kolejności. WartośćNone
w Pythonie jest zupełnie inna niż niezdefiniowana zmienna.None
jest jednak podobny do większości innych inkarnacjinull
(dopóki nie przejdziemy do bardziej tajemniczych szczegółów, przynajmniej).None
, co możesz zrobić z dowolnym innym „zwykłym” obiektem nieokreślonego typu: przechowywać go w kontenerach, wydrukować jego ciąg reprezentujący, sprawdzić na nim niektóre metadane ... W każdym razie, czy wypróbowałeś Google dla „python null równowartość"? Jestem poważny; to zajmie trochę analizy, ale informacje są tam.print x
i naciśnij enter. Spowoduje to błąd interpretera, podobnie jak większość języków podczas próby drukowania niezdefiniowanej zmiennej. Ale jeśli zdefiniujesz zmienną, a następnie spróbujesz ją wyczyścić za pomocą None, użycieprint x
kodu wygeneruje słowoNone
jako wynik. Jestem nowym użytkownikiem Pythona, więc mogę się pomylić, ale nie wygląda to na zachowanie wyczyszczonej zmiennej.Słowo
del
kluczowe wystarczy.Ale w tym przypadku głosuję za
self.left = None
źródło
del
ma również tę wadę, że jeśli spróbujesz usunąć zmienną, która nie istnieje, zgłasza wyjątek, co zwykle jest niepożądane.type=…
Kiedy chciałeś pisać,type(…)
usunięcie to jest najłatwiejszym sposobem na odzyskanie pierwotnej funkcjonalności. Oznacza to, że jeśli pozostaniesz przy nim jako Brak, nadal będziesz odcinał dostęp do podstawowej funkcji.set = set(myList)
i wtedy zdałem sobie sprawę, że nie mogę już używać zestawu jako funkcji (doh). Używaniedel set
pozwoliło mi użyć go ponownie jako FX. Oczywiście nigdy nie użyłbym tego zarezerwowanego var w rzeczywistym skrypcie.var = None
„usuwa wartość”, ustawiając wartość zmiennej na „null”, podobnie jak wartość „None”, jednak wskaźnik do zmiennej pozostaje.del var
całkowicie usuwa definicję zmiennej.W przypadku, gdy chcesz użyć zmiennej później, np. Ustaw dla niej nową wartość, tj. Zachowaj zmienną,
None
byłoby lepiej.źródło
W rzeczywistości nie usuwa to zmiennej / właściwości. Wystarczy, aby ustawić jego wartość na
None
, dlatego zmienna nadal będzie zajmować miejsce w pamięci. Jeśli chcesz całkowicie usunąć wszystkie istnienie zmiennej z pamięci, możesz po prostu wpisać:źródło
clear
nieremove
. del zabije atrybut i odnośniki. Jest o wiele czystsze ustawienie na Brak, niż można to sprawdzićif self.left
i byłoby to wystarczające, aby sprawdzić, czy węzeł jest pusty.del
, IMHO sprawia, że bardziej oczywiste jest, że o zmiennej można zapomnieć podczas analizowania mentalnego ' kod.if self.left:
, czy wolisz poradzić sobie z możliwym wyjątkiem NameError, który spowoduje awarię programu, jeśli nie obsłużysz go wszędzie ?Jeśli chcesz całkowicie usunąć, użyj
del
:del your_variable
Lub inaczej, aby wartość
None
:your_variable = None
Jeśli jest iterowalny (taki jak lista lub krotka), możesz go opróżnić, np .:
your_variable.clear()
Wtedy
your_variable
będzie pustyźródło
Czy chcesz usunąć zmienną, prawda?
ok, myślę, że mam najlepszy alternatywny pomysł na odpowiedź @bnul:
Możesz usunąć poszczególne nazwiska za pomocą
del
:del x
lub możesz usunąć je z obiektu globals ():for name in dir(): if not name.startswith('_'): del globals()[name]
To tylko przykładowa pętla; defensywnie usuwa tylko nazwy, które nie zaczynają się znakiem podkreślenia, przyjmując (nieuzasadnione) założenie, że na początku używałeś tylko interpretera nazw bez znaku podkreślenia. Zamiast tego możesz użyć zakodowanej listy nazwisk (białej listy), jeśli naprawdę chcesz być dokładny. Nie ma wbudowanej funkcji do wykonania czyszczenia, poza wyjściem i ponownym uruchomieniem interpretera.
Zaimportowane moduły (import os) pozostaną importowane, ponieważ odwołuje się do nich sys.modules; kolejne importy ponownie wykorzystają już zaimportowany obiekt modułu. Po prostu nie będziesz mieć odniesienia do nich w bieżącej globalnej przestrzeni nazw.
Proszę ponownie rozważyć tę odpowiedź!
źródło
Użyłem kilku wyżej wymienionych opcji:
lub ustawienie wartości Brak przy użyciu
Ważne jest, aby znać różnice i umieścić kilka procedur obsługi wyjątków, gdy używasz ustaw wartość na Brak. Jeśli drukujesz wartość instrukcji warunkowych przy użyciu szablonu, powiedzmy:
może zostać wyświetlona wartość zmiennej „Wartość zmiennej to Brak”. Dlatego musiałbyś umieścić tam kilka programów obsługi wyjątków:
Powyższe polecenie wyświetli wartości tylko wtedy, gdy self.left nie jest
None
źródło