Python None comparison: should I use “is” or ==?

后端 未结 3 1490
感情败类
感情败类 2020-11-22 14:10

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 determin

相关标签:
3条回答
  • 2020-11-22 14:34

    is is generally preferred when comparing arbitrary objects to singletons like None because it is faster and more predictable. is always compares by object identity, whereas what == will do depends on the exact type of the operands and even on their ordering.

    This recommendation is supported by PEP 8, which explicitly states that "comparisons to singletons like None should always be done with is or is not, never the equality operators."

    0 讨论(0)
  • 2020-11-22 14:46

    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
    
    0 讨论(0)
  • 2020-11-22 14:55

    PEP 8 defines that it is better to use the is operator when comparing singletons.

    0 讨论(0)
提交回复
热议问题