समस्या है कि यहाँ NaN के रूप में चल बिन्दु संख्या के लिए आईईईई मानक में परिभाषित, जो अपने आप के बराबर नहीं है है:
>>> float("nan") == float("nan")
False
जब एक शब्दकोश एक कुंजी दिखता है, यह लगभग यह करता है:
देखा जाने वाला कुंजी हैश की गणना करें।
उसी हैश के साथ dict में प्रत्येक कुंजी के लिए, जांचें कि यह देखने के लिए कुंजी से मेल खाता है या नहीं। इस चेक में
ए शामिल हैं। ऑब्जेक्ट पहचान के लिए जांच कर रहा है: यदि शब्दकोश में कुंजी और कुंजी को देखने की कुंजी is
ऑपरेटर द्वारा इंगित की गई एक ही वस्तु है, तो कुंजी मिली।
बी। यदि पहली जांच विफल हुई, तो __eq__
ऑपरेटर का उपयोग करके समानता की जांच करें।
पहला उदाहरण सफल होता है np.nan
के बाद से और np.nan
एक ही वस्तु है, इसलिए यह कोई बात नहीं वे बराबर की तुलना नहीं है:
>>> numpy.nan is numpy.nan
True
दूसरे मामले में, np.float64(np.nan)
और np.float64(np.nan)
नहीं हैं एक ही वस्तु - दो निर्माता कॉल दो अलग-अलग वस्तुओं को बनाने:
>>> numpy.float64(numpy.nan) is numpy.float64(numpy.nan)
False
के बाद से वस्तुओं भी करना बराबर की तुलना नहीं करते, शब्दकोश निष्कर्ष निकाला जाता है कि कुंजी नहीं मिली है और KeyError
फेंकता है।
तुम भी ऐसा कर सकते हैं:
>>> a = float("nan")
>>> b = float("nan")
>>> {a: 1, b: 2}
{nan: 1, nan: 2}
अंत में, यह एक saner विचार NaN एक शब्दकोश कुंजी के रूप में से बचने के लिए लगता है।
स्रोत
2011-06-22 14:57:55
यह हमेशा सत्य होगा: 'फ्लोट (' नैन ')! = फ्लोट (' नान ') ' – JBernardo