“is None”和“== None”的区别是什么?

534
我最近遇到了这个语法,但我不知道它们之间的区别。
如果有人能告诉我它们之间的区别,我会非常感激。

7
请参见 Python 中“==”和“is”的区别? - Matthew Flaschen
2
这回答解决了您的问题吗?"=="和"is"有什么区别吗? - user
不清楚这个问题是关于is==的区别,还是关于None的本质以及在不同上下文中行为差异的问题(后者是我来到这里的原因)。基于模糊和OP缺乏回应...我很惊讶这个问题有这么多赞。我的意思是...拜托...这个问题甚至没有写在实际问题中... - RTbecard
1
这个回答解决了你的问题吗?"foo is None"和"foo == None"之间有什么区别吗? - user3064538
5个回答

482

这个答案在这里有解释。

引用一下:

类可以自由地实现比较,可以选择让与None的比较表示某些含义(这其实是有意义的;如果有人让你从头开始实现None对象,你会如何让它与自己比较得出True?)。

就实际而言,自定义比较运算符不常见,因此没有太大区别。但你应该作为一般规则使用 is None


132
此外,使用is None速度比使用== None快大约50%。 - Nas Banov
45
@myusuf3: >>> timeit.Timer('None is None').timeit() | 0.225 |
timeit.Timer('None == None').timeit() | 0.328
- Nas Banov
17
您并不需要为此提供证明。 is 基本上是整数比较,而 == 不仅解决引用,还会比较可能具有不匹配类型的值。 - Pijusn
6
支持“is”的一种情况是,当一个变量可以是None或者与None没有有意义的比较时。例如,一个变量可以是numpy.array或None(我的特定情况)。 - Jblasco
6
我想在@TimLudwinski说的话上补充一点:首先,如果有人选择覆盖等号运算符以使None成为特殊情况,我们为什么要告诉他们不这样做呢?第二,“应该有且最好只有一种明显的方法来完成它。”而检查某物是否与另一物相等的明显方法就是使用等号运算符。 - Yuval
显示剩余12条评论

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

print(foo == None)
# True

print(foo is None)
# False

1
请查看 https://dev59.com/u3VD5IYBdhLWcg3wTJrF#26611,了解对此答案的一些有趣评论。 - fuenfundachtzig

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

21
如下所示的Ben Hoffstein的回答解释了,此答案是不正确的。x == None 可能会评估为 True,即使 x 不是 None,而是某个具有自定义等价运算符的类的实例。 https://dev59.com/1XA75IYBdhLWcg3wf5RV#3257957 - max

57

这取决于您将None与何进行比较。一些类具有自定义比较方法,这些方法对待 == Noneis 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

9
我认为这个答案比当前被接受的回答更好,因为它有易于理解的例子。 - Olsgaard

6

如果您使用numpy,

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

当numpy进行逐元素比较时,会给您报错。


另外:np.array(None) is None 的结果是 False - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接