Mój edytor ostrzega mnie podczas porównania my_var == None
, ale nie ostrzegam, gdy go używam my_var is None
.
Zrobiłem test w powłoce Pythona i ustaliłem, że obie są poprawną składnią, ale mój edytor wydaje się mówić, że my_var is None
jest to preferowane.
Czy tak jest, a jeśli tak, to dlaczego?
python
comparison
nonetype
Clay Wardell
źródło
źródło
is
- python.org/dev/peps/pep-0008/#programming-recommendationsOdpowiedzi:
Podsumowanie:
Użyj,
is
gdy chcesz sprawdzić tożsamość obiektu (np. Sprawdzić, czyvar
jestNone
). Użyj,==
gdy chcesz sprawdzić równość (np. Czy jestvar
równy3
?).Wyjaśnienie:
Możesz mieć niestandardowe klasy, do których
my_var == None
powróciTrue
na przykład:
is
sprawdza tożsamość obiektu . Jest tylko jeden obiektNone
, więc kiedy to robiszmy_var is None
, sprawdzasz, czy to faktycznie ten sam obiekt (nie tylko równoważne obiekty)Innymi słowy,
==
jest sprawdzanie równoważności (która jest definiowana od obiektu do obiektu), podczas gdyis
sprawdza tożsamość obiektu:źródło
is None
różni== None
?__eq__
można zdefiniować w dowolny sposób, aleis
nie można tak łatwo zmienić zachowania .is
”. Po komentarzu do list zmienił to na „… nawetis
(ale tylko jeśli jesteś szalony)”.object == None
właściwie jest to poprawny idiom (chociaż nie mogę wymyślić żadnego z góry mojej głowy). Musisz tylko wiedzieć, co robisz.is
jest ogólnie preferowany przy porównywaniu dowolnych obiektów z singletonami,None
ponieważ jest szybszy i bardziej przewidywalny.is
zawsze porównuje według tożsamości obiektu, a to, co==
zrobi, zależy od dokładnego rodzaju operandów, a nawet od ich kolejności.To zalecenie jest wspierane przez PEP 8 , który wyraźnie stwierdza, że „porównań z singletonami takimi jak None należy zawsze dokonywać z operatorami równości
is
lubis not
nigdy”.źródło
None
obiekt w ramach globalnego stałejNone
. Jeśli tak,NoneType
jest to szczegół implementacji, ponieważNone
singleton musi mieć jakiś typ. (Fakt, że nie można utworzyć wystąpienia tego typu jest to dobre wskazanie, że jej jedna instancja ma być pojedyncza.)None
, za wszelką cenę wykorzystaćobj == None
. Jeśli chcesz sprawdzić, czy obiekt jestNone
, użyjobj is None
. Istotą zalecenia PEP 8 (i tej odpowiedzi) jest to, że większość ludzi chce tych drugich, gdy chcą sprawdzić Brak, a zdarza się, że jest to szybsze i wyraźniejsze.None
różni się również od obiektów buforowanych, takich jak0
i innych małych liczb całkowitych, gdzie buforowanie jest tak naprawdę szczegółem implementacji. Różnica polega na tym, że liczba całkowita ma wartość wewnętrzną, która nadaje jej właściwości i można ją obliczyć. Z drugiej stronyNone
nie ma żadnego stanu , liczy się tylko jego tożsamość .PEP 8 określa, że lepiej jest używać
is
operatora podczas porównywania singletonów.źródło