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

时间:2010-07-15 16:52:11

标签: python jython

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

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

5 个答案:

答案 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)

这取决于您要与“无”进行比较。某些类具有自定义比较方法,该方法将== 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

答案 4 :(得分:2)

如果你使用numpy,

if np.zeros(3)==None: pass
当numpy进行元素比较时,

会给你错误