Search code examples
pythoncomparisonnonetype

Python None comparison: should I use "is" or ==?


My editor warns me when I compare my_var == None, but no warning when I use my_var is None.

I did a test in the Python shell and determined both are valid syntax, but my editor seems to be saying that my_var is None is preferred.

Is this the case, and if so, why?


Solution

  • Summary:

    Use is when you want to check against an object's identity (e.g. checking to see if var is None). Use == when you want to check equality (e.g. Is var equal to 3?).

    Explanation:

    You can have custom classes where my_var == None will return True

    e.g:

    class Negator(object):
        def __eq__(self,other):
            return not other
    
    thing = Negator()
    print thing == None    #True
    print thing is None    #False
    

    is checks for object identity. There is only 1 object None, so when you do my_var is None, you're checking whether they actually are the same object (not just equivalent objects)

    In other words, == is a check for equivalence (which is defined from object to object) whereas is checks for object identity:

    lst = [1,2,3]
    lst == lst[:]  # This is True since the lists are "equivalent"
    lst is lst[:]  # This is False since they're actually different objects