2016-07-29 20 views
21

यह मुझे परेशान करता है। यहां तक ​​कि पूर्वता क्रम जानने के बिना, एक देख सकते हैं कि अभिव्यक्ति इकट्ठा करने के लिए दो संभव तरीके False देना होगा:0 0 == 0 (# सच में मूल्यांकन करता है?)

>>> (0 is 0) == 0 
False 
>>> 0 is (0 == 0) 
False 

लेकिन

>>> 0 is 0 == 0 
True 

क्यों?

+10

यह एक डुप्ली होना चाहिए, लेकिन '0 0 == 0' को' (0 0 0) और (0 == 0) 'के रूप में पार्स किया गया है, जैसे कि 'a == b == c' जैसा कि पार्स किया गया है 'ए == बी और बी == सी'। –

+0

@PaulHankin आपको इसे एस्वर –

+0

के रूप में छोड़ देना चाहिए था: इस पोस्ट को देखें: [पाइथन के "है" ऑपरेटर को समझना] (http://stackoverflow.com/questions/13650293/understanding-pythons-is-operator) –

उत्तर

5

पायथन में तुलना ऑपरेटरों की श्रृंखला को चालू करते समय, ऑपरेटरों को वास्तव में अन्य ऑपरेटरों के परिणाम पर लागू नहीं किया जाता है, लेकिन अलग-अलग ऑपरेटरों पर लागू होते हैं। यह x ? y ?? z है (जहां ? और ?? कुछ तुलना ऑपरेटर के लिए खड़े होने वाले हैं) न तो (x ? y) ?? z और न ही x ? (y ?? z) के बराबर है, बल्कि x ? y and y ?? z है।

यह > और सह। के लिए विशेष रूप से उपयोगी है, जो आपको min < x < max जैसी चीजें लिखने की अनुमति देता है और यह एक बूलियन की तुलना करने के बजाय आप जो चाहते हैं वह कर सकते हैं (जो कि अन्य भाषाओं में होता है)।

19

आप तुलना ऑपरेटर चेनिंग का उपयोग कर रहे हैं। Comparisons documentation से

(0 is 0) and (0 == 0) 

: अभिव्यक्ति के रूप में व्याख्या की है

तुलना मनमाने ढंग से श्रृंखलित जा सकता है, जैसे, x < y <= z, x < y and y <= z के बराबर है कि y को छोड़कर केवल एक बार मूल्यांकन किया जाता है (लेकिन दोनों ही मामलों z में x < y को गलत होने पर भी मूल्यांकन नहीं किया जाता है)।

0 is 0 सच क्योंकि Python interns small integers, एक कार्यान्वयन विस्तार, (True) and (True) ताकि आप True उत्पादन है।

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