2012-04-21 37 views
8

我偶然發現在SciPy的的源代碼這行代碼,在stats module在Python中,x == x是否是False?

return 1.0*(x==x) 

1.0其他這回事情?換句話說,是否有任何x的值,使得x == x包含False

+1

在這種情況下'x'是什麼?它是否實現了'__eq__'方法?這種方法的回報是否會導致意想不到的事情?更多的背景可能是必要的。 – 2012-04-25 17:47:15

+0

我不確定我應該接受哪個答案是正確的,因爲a)關於'NaN'和覆蓋'__eq__'方法的答案都有他們的觀點,並且b)我意識到*爲什麼這個代碼在那裏:*它是意味着返回一個與'x' *完全相同大小的數組。 – astrojuanlu 2012-04-26 07:50:29

+0

@NeilG告訴SciPy開發者... – astrojuanlu 2012-04-28 07:54:27

回答

22

根據IEEE 754標準,非數字(NaN)必須總是比較錯誤,不管它與什麼比較。

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 
+0

你說得對,的確如此: >>> import numpy as np >>> np.nan == np.nan False – astrojuanlu 2012-04-26 07:48:12

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。

相關問題