在Python中,x == x是否可能为False?

8
我在 SciPy 的源代码中的 stats module 中发现了这行代码:(链接)
return 1.0*(x==x)

这个返回值是否是除了1.0之外的其他值?换句话说,是否存在某个x的值使得x == xFalse


1
在这个实例中,x是什么?它是否实现了__eq__方法?它对该方法的返回是否导致了意外的结果?更多的上下文可能是必要的。 - g.d.d.c
我不确定应该接受哪个答案是正确的,因为a)关于NaN和覆盖__eq__方法的回答都有其道理,b)我意识到这段代码为什么存在:它旨在返回一个与x大小相同的全1数组。 - astrojuanlu
@NeilG 告诉 SciPy 开发者们... - astrojuanlu
3个回答

22

根据 IEEE 754 标准,非数字(NaN)与任何值的比较结果都应该为 false。

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x=float("NaN")
>>> x==x
False

你是对的,确实如此:>>> import numpy as np >>> np.nan == np.nan False - astrojuanlu

9

用户定义的类型可以重写相等运算符来执行您想要的任何操作:

Python 3.2.2 (default, Feb 10 2012, 09:23:17) 
[GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...     def __eq__(self, other):
...         return False
... 
>>> x=A()
>>> x==x
False

3

这取决于 x 的值。我没有查看源代码,但假设你做了这样的事情:

class A:
 def __eq__(self,other):
  return bool(random.getrandbits(1))

x = A()

现在x == x可能返回false。

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