Mahdi Yusuf
Mahdi Yusuf

Reputation: 21018

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

I recently came across this syntax, I am unaware of the difference.

I would appreciate it if someone could tell me the difference.

Upvotes: 580

Views: 370110

Answers (5)

jf328
jf328

Reputation: 7331

If you use numpy,

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

will give you an error when numpy does elementwise comparison.

Upvotes: 8

Donald Miner
Donald Miner

Reputation: 39893

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"

Upvotes: 70

unutbu
unutbu

Reputation: 879113

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

print(foo == None)
# True

print(foo is None)
# False

Upvotes: 244

PGlivi
PGlivi

Reputation: 1056

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

Upvotes: 61

Ben Hoffstein
Ben Hoffstein

Reputation: 103325

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.

Upvotes: 514

Related Questions