2013-11-04 9 views
5

मैं पाइथन के लिए नया हूं और पाइथन लॉजिकल स्टेटमेंट्स की कोशिश करते समय। मैं इस पर आया हूं जिसे मैं समझ नहीं पा रहा हूं। क्या कोई मुझे बता सकता है कि पाइथन 2.7 में क्या हो रहा है। 0 और पायथन में झूठा मूल्य।बूलियन पायथन मूल्य भ्रम

 
>>> 0 or False 
False 
>>> False or 0 
0 

दुभाषिया अलग-अलग उत्तर क्यों दे रहा है?

+0

ध्यान दें कि ये दोनों मान "झूठी" हैं; यानी, वे दोनों एक कथन में 'गलत' का मूल्यांकन करते हैं। –

उत्तर

6

आप or ऑपरेटर के व्यवहार से उलझन में हैं; यह पहली अभिव्यक्ति देता है कि केवल अगर यह सत्य मान है; न 0 है और न ही False सच है तो दूसरा मान दिया जाता है:

>>> 0 or 'bar' 
'bar' 
>>> False or 'foo' 
'foo' 

कि संख्यात्मक 0, एक खाली कंटेनर, None या False सच माना जाता है (कस्टम कक्षाएं एक __bool__ विधि को लागू करने से है कि बदल सकते हैं (नहीं है कोई भी मान अजगर 3), __nonzero__ (अजगर 2) या __len__ (लंबाई 0 खाली है)

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

>>> True or 1/0 
True 

1/0 अभिव्यक्ति ZeroDivision अपवाद उठाएगी, लेकिन इसका मूल्यांकन पायथन द्वारा भी नहीं किया जाता है।

यह boolean operators documentation में दर्ज है:

अभिव्यक्ति x or y पहले का मूल्यांकन करता है x; यदि x सत्य है, तो इसका मूल्य वापस कर दिया गया है; अन्यथा, y का मूल्यांकन किया गया है और परिणामी मूल्य वापस कर दिया गया है।

इसी तरह, and पहली अभिव्यक्ति देता है यदि यह False है, अन्यथा दूसरी अभिव्यक्ति वापस आती है।

+0

"यह पहली अभिव्यक्ति देता है जो सत्य है" यहां 0 या झूठी में गलत कैसे सच है? –

+0

मुझे यह जवाब पसंद नहीं है क्योंकि औचित्य "यह पहली अभिव्यक्ति देता है जो सत्य है" व्यवहार को पूरी तरह से समझाता नहीं है।कुछ ऐसा लगता है जैसे "यह ऑपरेंड के माध्यम से जाता है और पहली अभिव्यक्ति देता है जो सत्य है, या अंतिम ऑपरेंड का सामना करना पड़ता है," कम सुरुचिपूर्ण, बेहतर व्यवहार को बेहतर तरीके से समझाएगा। –

+0

@WaleedKhan: शब्द समायोजित किया। –

1

इस व्यवहार की प्रकृति expression evaluation के अजगर के क्रम में है। पाइथन से बाएं से दाएं पर अभिव्यक्ति का मूल्यांकन करता है, और यह lazy manner में करता है। इसका अर्थ यह है कि अभिव्यक्ति का मूल्य True है, जब अभिव्यक्ति का मूल्य शेष अभिव्यक्ति के बावजूद, वर्कफ़्लो की शाखा का पालन करेगा, अभिव्यक्ति से जुड़ा हुआ है। यदि कोई अभिव्यक्ति True नहीं है, तो यह केवल सबसे हालिया (अंतिम एक) वापस कर देगा। यह कम्प्यूटेशनल संसाधनों को बचाने के लाभ देता है। निम्नलिखित कोड पर विचार करें:,

>>>False or False or True or range(10**8) 
True 
>>> 

ध्यान दें कि range(10**8) इस मामले में कहा जाता है कभी नहीं है, इसलिए, बहुत समय सहेजा गया है।

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