“ is None”和“ == None”有什么区别?


324

我最近遇到了这种语法,我不知道有什么区别。

如果有人可以告诉我与众不同,我将不胜感激。



1
这回答了你的问题了吗?“ ==”和“ is”之间有区别吗?
6

目前尚不清楚这个问题是关于isvs ==,还是关于确切的本质None以及在两种情况下的行为如何不同(后者就是我为什么在这里结束的原因)的问题。基于操作人员的含糊和缺乏回应,我感到惊讶的是,它获得了如此多的赞誉。我的意思是……cmon……这个问题甚至都没有写在实际问题中……
RTbecard

Answers:


291

答案在这里解释。

报价:

一个类可以自由选择以任何方式实现比较,并且可以选择与None进行比较意味着某种意义(这实际上是有道理的;如果有人告诉您从头开始实现None对象,那么您将如何获得它来比较True?反对自己?)。

实际上,由于自定义比较运算符很少见,因此差异不大。但是您应该使用is None一般规则。


57
此外,is None== None:) 快
〜50

26
@ myusuf3:>>> timeit.Timer('None is None')。timeit()| 0.225 | >>> timeit.Timer('None == None')。timeit()| 0.328
Nas Banov 2012年

9
@ myusuf3您真的不需要证明。is基本上是整数比较,而==不仅仅是解析引用,而是比较可能具有不匹配类型的值。
Pijusn

4
一个赞成“是”的人。当变量可以为None或与None没有任何有意义的比较时。例如,变量可以是numpy.array或None(我的特殊情况)。
Jblasco 2014年

3
我想补充一下@TimLudwinski所说的话:首先,如果有人选择重写均等运算符以使None成为特殊情况,那么为什么我们要告诉他们呢?第二,“应该有一种-最好只有一种-显而易见的方法。” 而且,检查某物是否等于某物的明显方法是相等运算符。
Yuval 2015年

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

print(foo==None)
# True

print(foo is None)
# False

56

在这种情况下,它们是相同的。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"

17
如本·霍夫斯坦(Ben Hoffstein)的下面stackoverflow.com/questions/3257919/is-none-vs-none/…的答案所述,此答案是不正确的。即使不是,也可以使用自己的自定义相等运算符对某个类的实例x == None求值。TruexNone
最大

5

如果您使用numpy,

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

numpy进行元素比较时会给你错误


3

这取决于您要与“无”进行比较。一些类具有自定义比较方法,这些方法与== 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.