Because None
is a singleton, there is only ever one copy of the object in a Python program.
is
is faster when testing against a single object, because only the pointers need to be equal. ==
tests for more information, the state of the objects tested needs to be the same too in that case.
This becomes more pronounced still if your x
object implements a custom object.__eq__()
method; it'll be called each time you use x == None
, while x is None
doesn't have such a hook. That means the interpreter has to execute some more Python code each time you do an equality test. Did I mention already that a simple pointer equality test (used for is
) is fast?
That hook also makes it possible for a custom type to declare itself equal to None
:
class Devious(object):
def __eq__(self, other):
return other is None
Now your x == None
test will be true even though x
is not actually None
, but an instance of Devious
instead. If you really wanted to know if x
was set to None
, only x is None
will be able to detect that case.
None
is not the only object you can test for identity with. Any time you need to know if a given name is referencing a specific object rather than a value, you should use is
.
For example, sometimes you need to allow for None
to be a valid value, but you want to detect if no value has been specified. Normally you could use None
as a sentinel to detect if an argument has been left out:
def foo(arg1, optional=None):
if optional is None:
# no value given for optional
but if you want None
to be a valid value, you'd use a different sentinel:
_sentinel = object()
def foo(arg1, optional=_sentinel):
if optional is _sentinel:
# no value given for optional
Now you can use foo(1, None)
and it'll be correctly treated as a value.