# python – What is the difference between ” is None ” and ” ==None “

## 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.

• Does this answer your question? Is there a difference between “==” and “is”?
• It’s unclear if this question is about is vs ==, or about the nature of what exactly None is and how the behaviour differs in either context (the latter is why I ended up here). Based on the vagueness and lack of OP responses… I’m surprised this has so many upvotes. I mean… cmon… the question is not even written in the actual question…

322 people think this answer is useful

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.

169 people think this answer is useful
class Foo:
def __eq__(self,other):
return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False



57 people think this answer is useful

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"



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 is None.

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



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