python - [झूठी, सच्ची] ""(सच्ची) क्यों नहीं होती?




python-2.7 python-3.x (6)

अगर मैं ऐसा करता हूं:

>>> False in [False, True]
True

यह True । केवल इसलिए कि False सूची में है।

लेकिन अगर मैं:

>>> not(True) in [False, True]
False

वह False लौटाता है। जबकि not(True) False बराबर नहीं है:

>>> not(True)
False

क्यूं कर?


आइए इसे एक संग्रह नियंत्रण जाँच ऑपरेशन के रूप में देखते हैं: [False, True] कुछ तत्वों से युक्त एक सूची है।

यह True in [False, True] अभिव्यक्ति True in [False, True] , क्योंकि यह True सूची में शामिल एक तत्व है।

इसलिए, not True in [False, True] है "बूलियन विपरीत" देता है, उपरोक्त अभिव्यक्ति का परिणाम not (बिना किसी कोष्ठक के पूर्वता को संरक्षित करने के लिए, जैसा not ऑपरेटर की तुलना में अधिक पूर्वता है)। इसलिए, not True कि False परिणाम not True होगा।

दूसरी ओर, (not True) in [False, True] False in [False, True] बराबर है, जो कि True ( False सूची में निहित है)।


उन अन्य उत्तरों के साथ, जिनका उल्लेख not किया गया है, की तुलना in कम है, वास्तव में आपका बयान इसके बराबर है:

not (True in [False, True])

लेकिन ध्यान दें कि यदि आप अपनी स्थिति को दूसरे से अलग नहीं करते हैं, तो अजगर को अलग करने के लिए 2 भूमिकाओं ( precedence या chaining ) का उपयोग किया जाएगा, और इस मामले में अजगर ने पूर्ववर्तीता का उपयोग किया। इसके अलावा, ध्यान दें कि यदि आप एक ऐसी शर्त को अलग करना चाहते हैं जिसमें आपको केवल शर्त या मूल्य नहीं, कोष्ठक में सभी शर्त रखने की आवश्यकता हो:

(not True) in [False, True]

लेकिन जैसा कि उल्लेख किया गया है, चाइनिंग ऑपरेटरों पर अजगर द्वारा एक और संशोधन है:

अजगर 3.x आधार पर:

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

उदाहरण के लिए निम्नलिखित कथन का परिणाम False :

>>> True == False in [False, True]
False

क्योंकि अजगर निम्नलिखित कथनों की श्रृंखला करेगा:

(True == False) and (False in [False, True])

जो वास्तव में False and True है जो False

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

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

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

उदाहरण :

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

एक अन्य प्रसिद्ध उदाहरण संख्या सीमा है:

7<x<20

जो बराबर है:

7<x and x<20   

यह not True in [False, True] रूप में मूल्यांकन कर रहा है, जो False लौटाता है क्योंकि True [False, True]

अगर तुम कोशिश करो

>>>(not(True)) in [False, True]
True

आपको अपेक्षित परिणाम मिलता है।


यह सब ऑपरेटर की पूर्ववर्तीता के बारे in है (इसमें अधिक मजबूत not )। लेकिन सही जगह पर कोष्ठक जोड़कर इसे आसानी से ठीक किया जा सकता है:

(not(True)) in [False, True]  # prints true

लिख रहे हैं:

not(True) in [False, True]

समान है:

not((True) in [False, True])

जो दिखता है यदि True सूची में है और परिणाम का "नहीं" लौटाता है।


3.x ऑपरेटर पूर्वता पर प्रलेखन है

 in binds tighter than not 

तो ऐसा करने से उद्देश्य पूरा होगा

 >>> (not True) in [False, True] True 

ऑपरेटर पूर्वता 2.x , 3.x नहीं की पूर्ववर्ती की तुलना में कम है। तो यह बराबर है:

>>> not ((True) in [False, True])
False

ये वो है जो तुम चाहते हो:

>>> (not True) in [False, True]
True

जैसा कि @ जारी किया गया है: यह कभी not(True) नहीं लिखने की सलाह दी जाती है, not True । पूर्व इसे फ़ंक्शन कॉल की तरह दिखता है, जबकि ऑपरेटर नहीं है, फ़ंक्शन नहीं है।





python-3.x