我最近遇到了这种语法,我不知道它的区别。
如果有人能告诉我差异,我将不胜感激。
答案 0 :(得分:229)
答案解释为here。
引用:
一个类可以自由实现 比较它选择的任何方式,以及它 可以选择进行比较 没有意思(事实上 说得通;如果有人告诉你 实现None对象 划伤,你还能怎么做到 比较True对自己?)。
实际上,由于自定义比较运算符很少,因此差别不大。但是你应该使用is None
作为一般规则。
答案 1 :(得分:119)
class Foo:
def __eq__(self,other):
return True
foo=Foo()
print(foo==None)
# True
print(foo is None)
# False
答案 2 :(得分:45)
在这种情况下,它们是相同的。 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"
答案 3 :(得分:11)
这取决于您要与“无”进行比较。某些类具有自定义比较方法,该方法将== None
与is None
区别对待。
尤其是a == None
的输出甚至不必是布尔值!! -经常引起错误的原因。
对于特定示例,请使用一个numpy数组,其中==
比较是逐元素实现的:
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
答案 4 :(得分:2)
如果你使用numpy,
if np.zeros(3)==None: pass
当numpy进行元素比较时,会给你错误