"是无"和"==无"之间的区别是什么?

myu*_*uf3 289 python jython

我最近遇到了这种语法,我不知道它的区别.

如果有人能告诉我差异,我将不胜感激.

Ben*_*ein 260

答案在这里解释.

报价:

一个类可以按照它选择的任何方式自由地实现比较,并且它可以选择与None进行比较意味着什么(实际上是有意义的;如果有人告诉你从头开始实现None对象,那么你怎么能得到它来比较True反对自己?).

实际上,由于自定义比较运算符很少,因此差别不大.但你应该is None作为一般规则使用.

  • 另外,`is None`比`== None`快一点(~50%):) (42认同)
  • @myusuf3:>>> timeit.Timer('None is None').timeit() | 0.225 | >>> timeit.Timer('None == None').timeit() | 0.328 (21认同)
  • @ myusuf3你真的不需要证明.`is`基本上是整数比较,而`==`不仅可以解析引用,还可以比较可能具有不匹配类型的值. (8认同)
  • 一个赞成"是".当变量可以是None或者与None没有有意义的比较时.例如,变量可以是numpy.array或None(我的特殊情况). (3认同)
  • 我想补充@TimLudwinski所说的内容:首先,如果有人选择覆盖相等运算符以使None成为特殊情况,为什么我们要告诉他们呢?其次,"应该有一个 - 最好只有一个 - 明显的做法." 而检查某些东西是否与某种东西相等的显而易见的方法就是等式运算符. (3认同)
  • Numpy 使用自定义比较运算符,并将对数组 == True/False 执行逐元素比较,并且在将来的某个时候将对 None 执行相同的比较。“如果数组 == False:”不起作用。将来“if array == None:”也不会起作用。不能忽略自定义运算符。 (3认同)
  • 就我个人而言,我觉得在所有情况下都应该使用 `==`,除非速度很重要或者你真的需要知道你是否指的是同一个对象。`==` 更简单也更容易理解。它不会让读者想知道“为什么他使用 `is` 而不是 `==`”。 (2认同)
  • 事实是,由于SQL NULL的创伤,我们所有人都这样做。 (2认同)

unu*_*tbu 132

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

print(foo==None)
# True

print(foo is None)
# False
Run Code Online (Sandbox Code Playgroud)


Don*_*ner 53

在这种情况下,它们是相同的.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
Run Code Online (Sandbox Code Playgroud)

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

p = None
q = None
p is q # True because they are both pointing to the same "None"
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的,正如Ben Hoffstein在http://stackoverflow.com/questions/3257919/is-none-vs-none/3257957#3257957下面的答案中所解释的那样.`x == None`可以评估为'True`,即使`x`不是'None`,但是某个类的实例具有自己的自定义相等运算符. (15认同)

PGl*_*ivi 23

这取决于您与 None 比较的是什么。某些类具有自定义比较方法,它们的处理== 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
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是比当前接受的答案更好的答案,因为它有易于理解的示例。 (2认同)

jf3*_*328 5

如果你使用 numpy,

if np.zeros(3)==None: pass
Run Code Online (Sandbox Code Playgroud)

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