Nie jest jasne, czy to pytanie dotyczy isvs ==, czy też natury tego, czym dokładnie Nonejest i czym różni się zachowanie w obu kontekstach (to właśnie dlatego skończyłem tutaj). Na podstawie niejasności i braku odpowiedzi OP ... Jestem zaskoczony, że ma tak wiele pozytywnych opinii. Mam na myśli ... cmon ... pytanie nie jest nawet zapisane w prawdziwym pytaniu ...
Klasa może zaimplementować porównanie w dowolny sposób i może wybrać porównanie z None, co ma znaczenie (co w rzeczywistości ma sens; jeśli ktoś powiedziałby ci, abyś zaimplementował obiekt None od zera, jak inaczej miałbyś go porównać do wartości True przeciwko sobie?).
Praktycznie rzecz biorąc, nie ma dużej różnicy, ponieważ niestandardowe operatory porównania są rzadkie. Ale powinieneś używać is Nonejako ogólnej zasady.
@ myusuf3 Naprawdę nie potrzebujesz na to dowodu. isjest zasadniczo porównaniem liczb całkowitych, podczas gdy ==nie tylko rozwiązuje odwołania, ale porównuje wartości, które mogą mieć typy niezgodne.
Pijusn
4
Jeden opowiada się za „jest”. Gdy zmienną może być None lub coś, co nie ma znaczącego porównania z None. Na przykład zmienną może być numpy.array lub None (mój szczególny przypadek).
Jblasco
3
Chciałbym dodać do tego, co mówi @TimLudwinski: po pierwsze, jeśli ktoś zdecyduje się zastąpić operator równości, aby nikt nie był wyjątkowym przypadkiem, dlaczego mielibyśmy mówić mu inaczej? Po drugie: „Powinien istnieć jeden - a najlepiej tylko jeden - oczywisty sposób na to”. Oczywistym sposobem sprawdzenia, czy coś jest równe, jest operator równości.
Ta odpowiedź jest nieprawidłowa, jak wyjaśniono w odpowiedzi Bena Hoffsteina poniżej stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Nonemoże oceniać, Truenawet jeśli xnie jest Noneto instancja jakiejś klasy z własnym niestandardowym operatorem równości.
maks.
5
Jeśli używasz numpy,
if np.zeros(3)==None:pass
da ci błąd, gdy numpy dokonuje porównania elementarnego
To zależy od tego, co porównujesz do Brak. Niektóre klasy mają niestandardowe metody porównywania, które traktują == Noneinaczej niż is None.
W szczególności wynik a == Nonenie musi być nawet logiczny !! - częsta przyczyna błędów.
Na konkretny przykład weź tablicę numpy, w której ==porównanie jest implementowane elementarnie:
import numpy as np
a = np.zeros(3)# now a is array([0., 0., 0.])
a ==None#compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a isNone#compares object to object, outputs False
==
orazis
w Pythonie?is
vs==
, czy też natury tego, czym dokładnieNone
jest i czym różni się zachowanie w obu kontekstach (to właśnie dlatego skończyłem tutaj). Na podstawie niejasności i braku odpowiedzi OP ... Jestem zaskoczony, że ma tak wiele pozytywnych opinii. Mam na myśli ... cmon ... pytanie nie jest nawet zapisane w prawdziwym pytaniu ...Odpowiedzi:
Odpowiedź wyjaśniono tutaj .
Cytować:
Praktycznie rzecz biorąc, nie ma dużej różnicy, ponieważ niestandardowe operatory porównania są rzadkie. Ale powinieneś używać
is None
jako ogólnej zasady.źródło
is None
jest nieco (~ 50%) szybszy niż== None
:)is
jest zasadniczo porównaniem liczb całkowitych, podczas gdy==
nie tylko rozwiązuje odwołania, ale porównuje wartości, które mogą mieć typy niezgodne.źródło
W tym przypadku są takie same.
None
jest obiektem singletonowym (istnieje tylko jedenNone
).is
sprawdza, czy obiekt jest tym samym obiektem, a == tylko sprawdza, czy są one równoważne.Na przykład:
Ale ponieważ jest tylko jeden
None
, zawsze będą one takie same iis
zwrócą Prawdę.źródło
x == None
może oceniać,True
nawet jeślix
nie jestNone
to instancja jakiejś klasy z własnym niestandardowym operatorem równości.Jeśli używasz numpy,
da ci błąd, gdy numpy dokonuje porównania elementarnego
źródło
To zależy od tego, co porównujesz do Brak. Niektóre klasy mają niestandardowe metody porównywania, które traktują
== None
inaczej niżis None
.W szczególności wynik
a == None
nie musi być nawet logiczny !! - częsta przyczyna błędów.Na konkretny przykład weź tablicę numpy, w której
==
porównanie jest implementowane elementarnie:źródło