2015-07-11 12 views
26

क्यों कि इन बयानों अपेक्षित तरीके से जब कोष्ठक उपयोग किया जाता है यह क्या है?क्यों सही है गलत == झूठा, पायथन में झूठा?</p> <pre><code>>>> (True is False) == False True >>> True is (False == False) True </code></pre> <p><strong>लेकिन</strong> यह <code>False</code> रिटर्न जब कोई कोष्ठक हैं:

>>> True is False == False 
False 
+3

स्पष्ट रूप से आप पाइथन सिंटैक्स के कुछ अंधेरे कोनों में से एक में गए (यानी उन जगहों पर जहां परिणाम काफी आश्चर्यजनक है)। – 6502

उत्तर

12

ऑपरेटर पूर्वता के बारे में अजगर documentation के आधार पर:

ध्यान दें कि तुलना, सदस्यता परीक्षण और पहचान परीक्षण, सभी एक ही पूर्वता है और में बताए अनुसार एक बाएँ-से-दाएँ चेनिंग सुविधा है तुलना अनुभाग।

>>> (True is False) and (False==False) 
False 

आप मान सकते हैं कि केंद्रीय वस्तु 2 संचालन और अन्य वस्तुओं (इस मामले में झूठी) के बीच साझा किया जाएगा:

तो वास्तव में आप निम्नलिखित की तरह एक श्रृंखलित बयान की है।

और ध्यान दें कि अपने भी सच सदस्यता परीक्षण और पहचान परीक्षण के संचालन जो निम्नलिखित ऑपरेंड हैं सहित सभी तुलना, के लिए:

in, not in, is, is not, <, <=, >, >=, !=, == 

उदाहरण:

>>> 1 in [1,2] == True 
False 
8

यह एक डबल असमानता है जिसे (True is False) and (False == False) के रूप में विस्तारित किया जाता है। उदाहरण के लिए देखें What is the operator precedence when writing a double inequality in Python (explicitly in the code, and how can this be overridden for arrays?)

+0

तो संक्षेप में, यह एक बग है? यह बहुत प्रतिद्वंद्वी लगता है। –

+2

दूसरी तरफ, आप '0 <0.25 <0.5' लिख सकते हैं जो अन्य भाषाओं में अजीब परिणाम देगा। –

+1

नहीं, यह एक बग नहीं है - यह आश्चर्यजनक भाषा का इरादा है कि आप – holdenweb

10

तुलना ऑपरेटर की बात करते समय पाइथन की एक अद्वितीय संक्रमणीय संपत्ति है। एक सरल मामले में देखना आसान होगा।

if 1 < x < 2: 
    # Do something 

ऐसा लगता है कि ऐसा लगता है। यह जांचता है कि 1 < एक्स और यदि x < 2. वही बात आपके गैर-संश्लेषित कोड में हो रही है।

>>> True is False == False 
False 

यह है कि क्या यह सच है जाँच कर रहा है झूठी, जिनमें से केवल एक सच है झूठी और गलत है ==।

+0

अहह! मैंने '1

1

अजगर निष्पादित करता चेनिंग यह ऑपरेटरों का सामना करना पड़ता है, तो एक अभिव्यक्ति का मूल्यांकन करते समय एक ही प्राथमिकता के। परीक्षण सहित

तुलना, है, जो सभी श्रृंखला से सही

नीचे उल्लेख ऑपरेटरों के लिए छोड़ दिया एक ही पूर्वता है एक ही पूर्वता है।

in, not in, is, is not, <, <=, >, >=, <>, !=, == 

तो, जब अजगर अभिव्यक्ति True is False == False मूल्यांकन करने के लिए कोशिश करता है, यह ऑपरेटरों is और == जो एक ही पूर्वता है का सामना करना पड़ता है, इसलिए यह बाएं से दाएं चेनिंग प्रदर्शन करती है।

(True is False) and (False == False) 

False आउटपुट के रूप में दे रही है:

तो, अभिव्यक्ति True is False == False वास्तव में के रूप में मूल्यांकन किया जाता है।

2

अजगर कई व्याख्या (में) जिस तरह से आप गणित में उम्मीद करेंगे समानताओं:

मठ a = b = c में सभी a = b, b = c और a = c मतलब है।

तो True is False == False मतलब है True == False और False == False और True == False, जो False है।

बूलियन स्थिरांक के लिए, is== के बराबर है।

+0

असल में, 'ए बी == सी' का मतलब है' (ए बी है) और (बी == सी) ':' ए' और 'सी' की तुलना नहीं की जाती है। '0.0 == 0 0 0' पर विचार करें। – Lynn

+0

@ मॉरीस मेरा मतलब था कि बी है और बी सी का मतलब है सी है। मैं केवल परिणाम निर्धारित करने का एक आसान तरीका दे रहा था कि यह कैसे संसाधित नहीं हुआ – prakharsingh95

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

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