Wyczyść zmienną w pythonie

Odpowiedzi:

157

Co jest nie tak z self.left = None?

bnaul
źródło
19
Nie znasz słowa kluczowego Brak. Czy to jest podobne do null w innych językach?
Bnicholas,
6
Tak; jest równoważne zeru.
Smashery
12
@Bnicholas Jednak nie jest tak jak nullw PHP, w tym ustawieniu zmienna na nullw PHP daje podobne zachowanie w większości przypadków, jakbyś nie zdefiniował jej w pierwszej kolejności. Wartość Nonew Pythonie jest zupełnie inna niż niezdefiniowana zmienna. Nonejest jednak podobny do większości innych inkarnacji null(dopóki nie przejdziemy do bardziej tajemniczych szczegółów, przynajmniej).
Ben,
To nie jest słowo kluczowe; jest to domyślnie ustawiona nazwa wbudowanego obiektu. Możesz zrobić wszystko 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.
Karl Knechtel
18
Otwórz terminal python, wpisz print xi 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życie print xkodu wygeneruje słowo Nonejako wynik. Jestem nowym użytkownikiem Pythona, więc mogę się pomylić, ale nie wygląda to na zachowanie wyczyszczonej zmiennej.
Musixauce3000
407

Słowo delkluczowe wystarczy.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Ale w tym przypadku głosuję za self.left = None

głodować
źródło
18
czasami to nie usuwa go całkowicie, usuwa to tylko odniesienie do pamięci. To może pozostawić zmienne-duchy w pamięci, które nie otrzymują gc.
Jakob Bowyer
4
delma również tę wadę, że jeśli spróbujesz usunąć zmienną, która nie istnieje, zgłasza wyjątek, co zwykle jest niepożądane.
Philip Kearns
33
Chciałem tylko zaznaczyć, że jeśli przypadkowo zadeklarowałeś zmienną, która zastępuje wbudowane polecenia, np. 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.
mpacer
1
Garbage Collection / Collector / Collected
mccc
1
Tego szukałem. Grając na linii cmd, miałem ... set = set(myList)i wtedy zdałem sobie sprawę, że nie mogę już używać zestawu jako funkcji (doh). Używanie del setpozwoliło mi użyć go ponownie jako FX. Oczywiście nigdy nie użyłbym tego zarezerwowanego var w rzeczywistym skrypcie.
jbchurchill
111

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ą, Nonebyłoby lepiej.

użytkownik11788
źródło
Co jeśli chcę całkowicie usunąć zmienną, która w niektórych okolicznościach nie istnieje. Czy jest jakiś parametr pozwalający uniknąć błędu? Muszę usunąć kilka zmiennych: del a, b, c, d Mógłbym użyć pętli i spróbować / oprócz, ale wolę jakiś przełącznik, aby tego uniknąć.
Tedo Vrbanec
63

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ć:

del self.left
Viraj Shah
źródło
8
Nie rozumiem, dlaczego odpowiedź = Brak jest tak popularna. To poprawna odpowiedź
Nikołaj Gromow
1
OP powiedział, że clearnie remove. del zabije atrybut i odnośniki. Jest o wiele czystsze ustawienie na Brak, niż można to sprawdzić if self.lefti byłoby to wystarczające, aby sprawdzić, czy węzeł jest pusty.
user1767754,
„Jest o wiele czystsze ustawienie na Brak” - warto wziąć pod uwagę, że jeśli ktoś (ty jakiś czas później lub współpracownik) czyta kod del, IMHO sprawia, że ​​bardziej oczywiste jest, że o zmiennej można zapomnieć podczas analizowania mentalnego ' kod.
Kieszenie i
1
@NikolayGromov w codziennym kodzie, jeśli chcesz uzyskać wartość self.left, wolisz sprawdzić 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 ?
Pierre.Sassoulas,
33
  • 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_variablebędzie pusty

U10 do przodu
źródło
W przypadku drugiej opcji „wyczyść jej zawartość” jest niepoprawna, spowoduje to jedynie ponowne przypisanie zmiennej do Brak, oryginalny obiekt pozostanie nadal (chyba że liczba odwołań spadnie do zera, w którym to przypadku jest on usuwany).
cs95
0

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ź!

Federico Migueletto
źródło
-1

Użyłem kilku wyżej wymienionych opcji:

del self.left

lub ustawienie wartości Brak przy użyciu

self.left = None

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:

print("The value of the variable is {}".format(self.left))

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:

if self.left:
    #Then only print stuff

Powyższe polecenie wyświetli wartości tylko wtedy, gdy self.left nie jest None

Navneet Kumar
źródło