What is the difference between “ is None ” and “ ==None ”
我最近遇到了这种语法,我不知道有什么不同。
如果有人能告诉我区别,我会很感激的。
答案在这里解释。
引用:
A class is free to implement
comparison any way it chooses, and it
can choose to make comparison against
None mean something (which actually
makes sense; if someone told you to
implement the None object from
scratch, how else would you get it to
compare True against itself?).
号
实际上,没有太大的区别,因为自定义比较运算符很少见。但是你应该使用is None作为一个一般规则。
- 那是一本有趣(简短)的书。以及一些有用的信息到isv.==中。
- 另外,is None比== None快一点(~50%)。
- @纳斯巴诺夫,你有没有链接到你读到的地方?
- @myusuf3:>>>timeit.timer('none is none').timeit()0.225>>>timeit.timer('none==none').timeit()0.328
- @你真的不需要证据。is基本上是整数比较,而==不仅解析引用,而且比较可能存在不匹配类型的值。
- 就我个人而言,我觉得在所有情况下都应该使用==,除非速度很重要,或者你真的需要知道你所指的是同一个对象。==更简单,更容易理解。这并没有让读者疑惑"他为什么用is而不是=="。
- 一个赞成"是"。当一个变量可以是"无"或与"无"没有意义的比较时。例如,变量可以是numpy.array或none(我的特殊情况)。
- 我想补充一下@timludwinski所说的话:首先,如果有人选择重写equality操作符,使其不成为一个特殊情况,我们为什么要告诉他们其他情况呢?第二,"应该有一个——最好只有一个——明显的方法来完成它。"而且,检查某事物是否等于某事物的明显方法是,好吧,相等运算符。
- 就我个人而言,我发现==没有而且!=没有比"is none"和"is not none"更容易阅读的了——它只是更简洁而已。想象一下,在Java中,如果你必须键入"不为空"代替"!=null"和"is null"代替"==null"!我想那会很烦人,很快!
- 事实上,我们都这样做是因为SQL空的创伤。
- numpy使用自定义比较运算符,将对array==true/false执行逐元素比较,并且在将来的某个时候对none执行相同的操作。"如果array==false:"不起作用。将来"if array==none:"也不会起作用。不能忽略自定义运算符。
1 2 3 4 5 6 7 8 9 10
| class Foo:
def __eq__(self,other):
return True
foo=Foo()
print(foo==None)
# True
print(foo is None)
# False |
在这种情况下,它们是相同的。None是一个单体对象(只有一个None存在)。
is检查对象是否是同一对象,而==只检查它们是否相等。
例如:
1 2 3 4
| 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将返回真值。
1 2 3
| p = None
q = None
p is q # True because they are both pointing to the same"None" |
号
- 正如本·霍夫斯坦在stackoverflow.com/questions/3257919/is none vs none/hellip;下面的回答所解释的,这个答案是不正确的。即使x不是None而是具有自己的自定义相等运算符的某个类的实例,x == None也可以对True进行评估。
如果你用麻木,
1
| if np.zeros(3)==None: pass |
。
当numpy进行elementwise比较时会出错