The Question :
360 people think this question is useful
I recently came across this syntax, I am unaware of the difference.
I would appreciate it if someone could tell me the difference.
The Question Comments :
The Answer 1
322 people think this answer is useful
The answer is explained here.
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.
The Answer 2
169 people think this answer is useful
print(foo is None)
The Answer 3
57 people think this answer is useful
In this case, they are the same.
None is a singleton object (there only ever exists one
is checks to see if the object is the same object, while == just checks if they are equivalent.
p = 
q = 
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"
The Answer 4
11 people think this answer is useful
It depends on what you are comparing to None. Some classes have custom comparison methods that treat
== None differently from
In particular the output of
a == None does not even have to be boolean !! – a frequent cause of bugs.
For a specific example take a numpy array where the
== comparison is implemented elementwise:
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 is None #compares object to object, outputs False
The Answer 5
5 people think this answer is useful
If you use numpy,
if np.zeros(3)==None: pass
will give you error when numpy does elementwise comparison