2016-08-05 4 views
9

पायथन में, एक मान x हमेशा बराबर के लिए बाध्य नहीं होता है। शायद सबसे अच्छा ज्ञात उदाहरण NaN:गैर-रिफ्लेक्सिव तत्वों वाले संग्रहों की तुलना

>>> x = float("NaN") 
>>> x == x 
False 

अब बिल्कुल एक आइटम की एक सूची पर विचार करें। हम इस तरह की दो सूचियों को बराबर पर विचार कर सकते हैं यदि केवल वे आइटम बराबर थे। उदाहरण के लिए:

>>> ["hello"] == ["hello"] 
True 

लेकिन इस NaN साथ मामला हो प्रतीत नहीं होता है:

>>> x = float("NaN") 
>>> x == x 
False 
>>> [x] == [x] 
True 

ताकि "इसके बराबर नहीं" हैं मदों की इन सूचियों, "बराबर" कर रहे हैं। लेकिन केवल कभी-कभी ... विशेष रूप से:

  • दो सूचियों में NaN के समान उदाहरण शामिल हैं; जबकि
  • दो अलग-अलग NaN के विभिन्न उदाहरणों से मिलकर सूचियों बराबर नहीं हैं

का निरीक्षण करें:

>>> x = float("NaN") 
>>> [x] == [x] 
True 
>>> [x] == [float("NaN")] 
False 

यह सामान्य व्यवहार भी इस तरह के tuples और सेट के रूप में अन्य संग्रह प्रकार के लिए लागू होता है। क्या इसके लिए कोई अच्छा तर्क है?

+0

यदि आप * चाहते हैं * NaNs के बराबर नहीं होने के साथ तुलना करने के लिए, आप NumPy का उपयोग कर सकते हैं, जो उन्हें इस तरह मानता है: '(np.array (a) == np.array (b))। सभी() यदि कोई नाएन हैं तो झूठी वापसी होगी। –

उत्तर

7

प्रति the docs,

तत्वों की रिफ्लेक्सिविटी को लागू करने में, संग्रह में से तुलना मानता है कि हमेशा सच है के लिए एक संग्रह तत्व एक्स, एक्स == एक्स। उस धारणा के आधार पर, तत्व पहचान की तुलना पहले की जाती है, और तत्व तुलना केवल विशिष्ट तत्वों के लिए की जाती है। यह दृष्टिकोण एक ही परिणाम उत्पन्न करता है क्योंकि एक सख्त तत्व तुलना होगी, यदि तुलना किए गए तत्व रिफ्लेक्सिव हैं।

>>> nan = float('NaN') 
>>> nan is nan 
True 
>>> nan == nan 
False     <-- the defined non-reflexive behavior of NaN 
>>> [nan] == [nan] 
True     <-- list enforces reflexivity and tests identity first 
: जब एक सूची में इस्तेमाल किया उदाहरण के लिए गैर कर्मकर्त्ता नहीं एक संख्या मान निम्न तुलना व्यवहार में परिणाम: गैर कर्मकर्त्ता तत्वों के लिए, परिणाम सख्त तत्व की तुलना के लिए की तुलना में अलग है, और चौंकाने वाली हो सकती
+0

क्या सुविधा के अलावा संकल्प के लिए एक ज्ञात तर्क है (और तुलनात्मक क्षमता शायद)? – donkopotamus

+0

यह इतिहास का दुर्घटना हो सकता है। देखें [पीईपी 207] (https://www.python.org/dev/peps/pep-0207/): "रिफ्लेक्सिविटी नियम * * पाइथन द्वारा ग्रहण किए गए हैं। इस प्रकार, दुभाषिया x> x x= x के साथ y> x को स्वैप कर सकता है x <= y के साथ, और x == y और x! = y के तर्कों को स्वैप कर सकता है। " यह चीजों के तरीके का एक बयान है। यह कहता है, "(नोट: पायथन वर्तमान में मानता है कि x == x हमेशा सत्य है और x! = X कभी सत्य नहीं है; इसे ग्रहण नहीं किया जाना चाहिए।)" जो इंगित करता है कि 'list .__ eq__' लागू किया गया था * धारणा * के साथ * x! = x' कभी भी सच नहीं हो सकता है, भले ही यह निकलता है, जिसे ग्रहण नहीं किया जाना चाहिए था। – unutbu

+0

यह दिलचस्प है ... क्या आपके पास [इस सवाल] पर एक दृश्य है (http://stackoverflow.com/questions/38779970/collection-comparison-is-reflexive-yet-does-not-short-circuit- क्यों) बिलकुल? – donkopotamus

संबंधित मुद्दे