我最近遇到了这个语法,我不知道有什么不同。

如果有人能告诉我其中的区别,我会很感激。


在这种情况下,它们是一样的。None是一个单例对象(只存在一个None)。

Is检查对象是否是相同的对象,而==只是检查它们是否相等。

例如:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

但由于只有一个None,它们将始终相同,并且is将返回True。

p = None
q = None
p is q # True because they are both pointing to the same "None"

答案在这里解释。

引用:

类可以自由实现 它选择任何方式进行比较,而它 可以选择做对比吗 没有意味着什么(实际上 是有意义的;如果有人让你这么做 实现来自的None对象 你还能怎么把它弄到 比较True和它自己?)

实际上,没有太大区别,因为自定义比较操作符很少。但您应该使用is None作为一般规则。


class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

如果你使用numpy,

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

会给你错误时,numpy做elementwise比较


这取决于与None比较的是什么。一些类具有自定义比较方法,将== None与is None区别对待。

特别是,a == None的输出甚至不必是布尔值!!- bug的常见原因。

对于一个特定的例子,取一个numpy数组,其中==比较是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