2010-10-12 13 views
36
In [20]: print None or False 
-------> print(None or False) 
False 

In [21]: print False or None 
-------> print(False or None) 
None 

यह व्यवहार मुझे भ्रमित करता है। क्या कोई मुझे समझा सकता है कि ऐसा क्यों हो रहा है? मुझे उम्मीद है कि वे दोनों एक ही व्यवहार करेंगे।झूठी या कोई नहीं बनाम कोई भी या गलत

+2

http://stackoverflow.com/questions/2017230/why-arent-and-and-or-operators-in-python और कई अन्य। –

+2

पाइथन (यानी: और/या ऑपरेटरों) में ["बूलियन" संचालन के संभावित डुप्लिकेट (यानी: और/या ऑपरेटरों)] (http://stackoverflow.com/questions/3826473/boolean-operations-in-python-ie-the-and-or- ऑपरेटरों) –

+0

@ सिलेंटगोस्ट: अगर किसी को भी गलत के रूप में नहीं माना जाता है, तो यह झूठी जगह के बजाय कोई भी क्यों नहीं लौटाता है? दो गलत मूल्यों पर लागू या लागू नहीं होना चाहिए गलत? – yoshi

उत्तर

54

अभिव्यक्ति x or yx अगर x का मूल्यांकन सही है, या y अगर x गलत है।

ध्यान दें कि उपर्युक्त वाक्य में "सत्य" और "झूठा" "सच्चाई" के बारे में बात कर रहे हैं, निश्चित मूल्य True और False नहीं। कुछ "सत्य" है जो if कथन सफल होता है; कुछ जो "झूठा" है, वह असफल हो जाता है। "झूठी" मानों में False, None, 0 और [] (एक खाली सूची) शामिल हैं।

+4

एलओएल, हाल ही में तैयार शब्द [सत्यता] (http://en.wikipedia.org/wiki/Truthiness) का रचनात्मक अनुप्रयोग, लेकिन यहां काफी उपयुक्त है, इसकी इसके बावजूद संदिग्ध उत्पत्ति। – martineau

+2

@ मार्टिनौ: यह तकनीकी अर्थ में बहुत पुराना शब्द है। कोल्बर्ट प्रोग्रामर की तुलना में इसे मुख्यधारा करने का एक बेहतर मौका है, लेकिन वह एकमात्र स्रोत नहीं है। –

+2

हाँ, स्पष्ट रूप से एक * बहुत * पुरानी अवधि। एटिमोलॉजी के लिए विकिपीडिया पर वे "1824 में पहले प्रमाणित" इंगित करते हैं। मैंने तकनीकी अर्थों का उपयोग कभी नहीं देखा है कि @RichieHindle ने किया - हालांकि यह इस मामले में सही समझ में आता है। – martineau

0

एक बुलियन दृष्टिकोण से वे दोनों समान व्यवहार करते हैं, दोनों एक मूल्य लौटते हैं जो झूठे मूल्यांकन करता है।

or केवल दिए गए मानों का "पुन: उपयोग" करता है, बाएं को वापस लौटाता है यदि यह सत्य था और सही अन्यथा।

0
Condition1 or Condition2 

यदि स्थिति 1 गलत है तो evalute और condition2 वापस करें। कोई भी गलत नहीं है।

8

"या" ऑपरेटर रिटर्न अपनी पहली संकार्य के मूल्य, अगर है कि मूल्य pythonic बूलियन अर्थों में सच (अपने "truthiness" उर्फ) है, अन्यथा यह रिटर्न मूल्य अपनी दूसरी संकार्य के, जो कुछ भी होता हैपर में पर अनुभाग में Boolean operations शीर्षक वाले उपखंड देखें।

आपके दोनों उदाहरणों में, पहला ऑपरेंड झूठा माना जाता है, इसलिए दूसरे का मूल्य अभिव्यक्ति का मूल्यांकन करने का परिणाम बन जाता है।

4

एक करीबी संबंधित विषय: पायथन का or और andshort-circuit। लॉजिकल or ऑपरेशन में, यदि कोई तर्क सत्य है, तो पूरी चीज सच होगी और कुछ भी और मूल्यांकन करने की आवश्यकता नहीं है; पाइथन तुरंत "सत्य" मान देता है। यदि यह खत्म हो जाता है और कुछ भी सत्य नहीं होता है, तो यह अंतिम तर्क देता है जो इसे संभाला जाता है, जो एक "झूठा" मान होगा।

and विपरीत है, अगर यह कोई झूठा मान देखता है, तो यह तत्काल उस "झूठे" मान से बाहर निकल जाएगा, या यदि यह सब कुछ हो जाता है, तो अंतिम "सत्य" मान देता है।

>>> 1 or 2 # first value TRUE, second value doesn't matter 
1 
>>> 1 and 2 # first value TRUE, second value might matter 
2 
>>> 0 or 0.0 # first value FALSE, second value might matter 
0.0 
>>> 0 and 0.0 # first value FALSE, second value doesn't matter 
0 
+0

कड़ाई से बोलते हुए, पायथन 'या' और 'और' संचालन को शॉर्ट-सर्किट नहीं करता है क्योंकि इसे सही या गलत पर मूल्यांकन करने के लिए मजबूर नहीं किया जाता है, इसके बजाय, यह तर्क देता है, ताकि उपयोगकर्ता ऑब्जेक्ट की सत्यता लागू कर सके । उस अर्थ में, रिचीइंडी द्वारा उत्तर बहुत स्पष्ट है: या यदि पहले सत्य का मूल्यांकन होता है तो पहले तर्क को वापस कर दें, अन्यथा दूसरा लौटाएं; के लिए और, यह कन्वर्ट है, दूसरा मूल्यांकन करें यदि पहला मूल्यांकन सही है, अन्यथा पहले। –

1

आप यह समझना होगा कि None, False और True सभी एकमात्र कर रहे हैं।

उदाहरण के लिए, if foo is not None का अर्थ है कि foo में None के अलावा कुछ मूल्य है। यह if foo जैसा ही काम करता है जो मूल रूप से if foo == True है।

तो, not None और True वैसे ही काम करते हैं। इसके अलावा, None और False वही काम करते हैं।

>>> foo = not None 
>>> bool(foo) 
True 
>>> foo = 5 # Giving an arbitrary value here 
>>> bool(foo) 
True 

>>> foo = None 
>>> bool(foo) 
False 
>>> foo = 5 # Giving an arbitrary value here 
>>> bool(foo) 
True 

महत्वपूर्ण बात का एहसास करने और जब कोडिंग के बारे में पता होना करने के लिए है कि जब दो बातें की तुलना, None जरूरत is, लेकिन True और False जरूरत == है। if foo == None से बचें और केवल if foo is None करें और if foo != None से बचें और केवल if foo is not None करें। if foo is not None के मामले में, बस if foo करें। if foo is None के मामले में, बस if not foo करें।

नोट: True मूल रूप से 1 और False मूल रूप से 0 है। पायथन के पुराने दिनों में, हमारे पास सत्य के मूल्य के लिए केवल 1 था और हमारे पास झूठे मूल्य के लिए 0 था। यह 1 के बजाय True कहने के लिए और अधिक समझने योग्य और मानव-अनुकूल है और 0 के बजाय False कहने के लिए अधिक समझने योग्य और मानव-अनुकूल है।

+0

"अगर foo कोई नहीं है 'के मामले में, बस' अगर foo' 'करें: कृपया ध्यान दें कि' अगर foo' 'none' की जांच के समान नहीं है! 'If' कथन अपनी अभिव्यक्ति को पहले 'बूल' में परिवर्तित करता है, इसलिए यदि 'foo == 0',' अगर foo' विफल हो जाएगा। – Norrius

+0

कोई भी या गलत या 0 समान बात नहीं है जैसे तर्क माना जाता है। कोडिंग करते समय बस एक ही तर्क के साथ चिपके रहें। यदि आप एक वैरिएबल को किसी का प्रारंभिक मान नहीं देते हैं, तो बाद में स्रोत कोड में "अगर foo कोई नहीं है" के साथ इस मान को जांचने के साथ चिपकाएं, लेकिन यह मूल रूप से "अगर नहीं है" की जांच के समान है। यह बहुमुखी है, इसलिए जो कुछ भी आपको लगता है उसका उपयोग करें। –

+0

मैं बस यह इंगित कर रहा हूं कि यह "मूल रूप से वही" सूक्ष्म बग का स्रोत हो सकता है। मान लीजिए कि आपके पास 'मस्ती मज़ेदार है (foo: str = none): अगर foo: bar'। अब, जब कोई खाली स्ट्रिंग में गुजरता है तो क्या होता है? यदि आपके रिकॉर्ड्स में कोई खाली स्ट्रिंग अलग नहीं है तो यह वांछित परिणाम नहीं हो सकता है। – Norrius

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