问题:“ is None”和“ == None”有什么区别?
我最近遇到了这种语法,我不知道有什么区别。
如果有人可以告诉我与众不同,我将不胜感激。
回答 0
答案在这里解释。
报价:
一个类可以自由选择以任何方式实现比较,并且可以选择与None进行比较意味着某种意义(这实际上是有道理的;如果有人告诉您从头开始实现None对象,那么您将如何获得它来比较True?反对自己?)。
实际上,由于自定义比较运算符很少见,因此差异不大。但是您应该使用is None
一般规则。
回答 1
class Foo:
def __eq__(self,other):
return True
foo=Foo()
print(foo==None)
# True
print(foo is None)
# False
回答 2
在这种情况下,它们是相同的。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
如果您使用numpy,
if np.zeros(3)==None: pass
numpy进行元素比较时会给你错误
回答 4
这取决于您要与“无”进行比较。一些类具有自定义比较方法,这些方法与== 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