If I write this:
if x == None:
x = 1
My pyCharm editor keeps suggesting that I should use 'is' instead of '==':
if x is None:
x = 1
For any other equality check pyCharm does not suggest the use of 'is', like:
if x == 2:
x = 1
Why is the 'is' operator preferred over the '==' operator while checking if object is None?
Why is it preferred only for None?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With