What is the difference between “ is None ” and “ ==None ”

后端 未结 5 903
无人共我
无人共我 2020-11-22 11:33

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

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

相关标签:
5条回答
  • 2020-11-22 11:41

    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
    
    0 讨论(0)
  • 2020-11-22 11:56
    class Foo:
        def __eq__(self,other):
            return True
    foo=Foo()
    
    print(foo==None)
    # True
    
    print(foo is None)
    # False
    
    0 讨论(0)
  • 2020-11-22 11:58

    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.

    0 讨论(0)
  • 2020-11-22 11:58

    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"
    
    0 讨论(0)
  • 2020-11-22 12:01

    If you use numpy,

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

    will give you error when numpy does elementwise comparison

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