The Python Oracle

What is the difference between "is None" and "== None"

Become part of the top 3% of the developers by applying to Toptal https://topt.al/25cXVn

--

Music by Eric Matyas
https://www.soundimage.org
Track title: Puzzle Game 2 Looping

--

Chapters
00:00 Question
00:24 Accepted answer (Score 452)
01:03 Answer 2 (Score 223)
01:14 Answer 3 (Score 69)
01:51 Answer 4 (Score 44)
02:27 Thank you

--

Full question
https://stackoverflow.com/questions/3257...

Accepted answer links:
[here]: http://jaredgrubb.blogspot.com/2009/04/p...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#python

#avk47



ACCEPTED ANSWER

Score 508


The answer is explained here.

To quote:

A class is free to implement comparison any way it chooses, and it can choose to make comparison against None mean something (which actually makes sense; if someone told you to implement the None object from scratch, how else would you get it to compare True against itself?).

Practically-speaking, there is not much difference since custom comparison operators are rare. But you should use is None as a general rule.




ANSWER 2

Score 238


class Foo:
    def __eq__(self, other):
        return True
foo = Foo()

print(foo == None)
# True

print(foo is None)
# False



ANSWER 3

Score 70


In this case, they are the same. None is a singleton object (there only ever exists one None).

is checks to see if the object is the same object, while == just checks if they are equivalent.

For example:

p = [1]
q = [1]
p is q  # False because they are not the same actual object
p == q  # True because they are equivalent

But since there is only one None, they will always be the same, and is will return True.

p = None
q = None
p is q  # True because they are both pointing to the same "None"



ANSWER 4

Score 8


If you use numpy,

if np.zeros(3) == None: pass

will give you an error when numpy does elementwise comparison.