2012-08-09 6 views
9

मैं कुछ कोड है कि पढ़ता है का सामना करना पड़ाक्या पाइथन में `if bool (x)` और `if x` के बीच कोई अंतर है?</p> <pre><code>if bool(x): doSomething </code></pre> <p>मुझे लगता है कि निम्नलिखित एक ही काम करते हैं:

if x: 
    doSomething 

The reference कहना है कि यह सूट का मूल्यांकन करता है, तो परीक्षण अभिव्यक्ति

सही पाए है

संदर्भ बूलियन अभिव्यक्ति का कहना है: गलत:

बूलियन संचालन के संदर्भ में, और भी जब भाव नियंत्रण प्रवाह बयानों द्वारा उपयोग किया जाता नियंत्रण प्रवाह बयानों द्वारा किया जाता है, निम्न मान के रूप में झूठा समझा जाता है , कोई नहीं, सभी प्रकार के संख्यात्मक शून्य, और खाली तार और कंटेनर ... अन्य सभी मानों को सत्य के रूप में व्याख्या किया जाता है।

referencebool() समारोह का कहना है:

मानक सच्चाई परीक्षण प्रक्रिया

का उपयोग कर, एक बूलियन के लिए एक मूल्य कन्वर्ट तो समान ऊपर दो हैं या वहाँ कुछ अतिरिक्त है इसके लिए subtlety?

+1

बस दस्तावेज़ों में पहले लिंक का पालन करें और यदि आपका जवाब होगा। – phant0m

+2

मुझे पता है कि संदर्भ क्या कहता है। यही कारण है कि मैंने इसे उद्धृत किया। जैसा कि संदर्भ कहता है, यह एक विनिर्देश नहीं है, और मैं पूछ रहा हूं कि दस्तावेज़ों का मेरा पढ़ने सही है या नहीं। – Joe

+0

नहीं, यह आपको _ _nonzero() _ _ – phant0m

उत्तर

7

if__nonzero__() का उपयोग करेगा यदि bool() सत्य के लिए मूल्य का परीक्षण करते समय उपलब्ध है। तो हाँ, व्यवहार बराबर है।

प्रलेखन से:

बूलियन संचालन के संदर्भ में, और भी जब भाव नियंत्रण प्रवाह बयानों द्वारा प्रयोग किया जाता है, निम्न मान व्याख्या कर रहे हैं के रूप में झूठी: झूठे, कोई नहीं, सब के संख्यात्मक शून्य प्रकार, और खाली तार और कंटेनर (स्ट्रिंग्स, टुपल्स, सूचियों, शब्दकोशों, सेट और फ्रोजनसेट्स सहित)। अन्य सभी मूल्यों को सत्य के रूप में व्याख्या किया जाता है। (एक तरह से इसे बदलने के लिए के लिए __nonzero__() विशेष विधि देखें।)

object.__nonzero__(self)

सच्चाई मूल्य परीक्षण लागू करने के लिए कहा जाता है और निर्मित आपरेशन bool(); झूठी है या सही पर लौटना चाहिए, या उनके पूर्णांक समकक्ष 0 या 1. जब यह विधि परिभाषित नहीं की जाती है, __len__() कहा जाता है, यदि इसे परिभाषित किया गया है, और ऑब्जेक्ट को सही माना जाता है यदि इसका परिणाम nonzero है। यदि कोई वर्ग न तो __len__() और न ही __nonzero__() परिभाषित करता है, तो इसके सभी उदाहरण सत्य मानते हैं।

+1

यह पहला जवाब नहीं था, लेकिन इसमें एक स्पष्ट लिंक है 'if' और' bool() 'फ़ंक्शन, इसलिए सही चिह्नित करना। – Joe

+2

'__nonzero__' को पायथन 3.x में' __bool__' के रूप में जाना जाता है। – Darthfett

14

ऑब्जेक्ट्स को बूल प्रकार में परिवर्तित कर दिया जाता है जब उन्हें किसी कथन में रखा जाता है। इसलिए, अधिकांश प्रयोजनों के लिए, कथन में x और bool(x) के बीच कोई अंतर नहीं है। हालांकि, अगर आप bool() पर कॉल करते हैं तो आप अतिरिक्त ओवरहेड लेंगे क्योंकि आप फ़ंक्शन कॉल कर रहे हैं।

In [7]: %timeit if(''): pass 
10000000 loops, best of 3: 21.5 ns per loop 

In [8]: %timeit if(bool('')): pass 
1000000 loops, best of 3: 235 ns per loop 
+2

आपके कोड में मिलान किए गए लूप चेकर्स हैं .... एक 10,000,000 है अन्य 1,000,000 –

+6

@InbarRose: नहीं, यह कितनी बार 'टाइमिट' looped है। इसने दूसरे मामले में कम करने का फैसला किया क्योंकि यह 10 गुना धीमा था। 'प्रति लूप 'महत्वपूर्ण संख्या है। – DSM

+0

@DSM ओह, ठीक है :) –

3

किसी भी वस्तु है कि आप एक if बयान में डाल एक bool कुछ आंतरिक अजगर चेकर के आधार पर करने के लिए परिवर्तित किया जाएगा, सामान्य रूप से नहीं एक मुद्दा है, वहाँ bool(x) और (x) के बीच कोई अंतर नहीं है: यहाँ यह प्रदर्शित करने के लिए एक त्वरित परीक्षण है जब if कथन के अंदर।

return bool(x)

जो वापसी होगी "true या false" वस्तु के आधार पर:

हालांकि, कारण bool(x) मौजूद है जैसे मामलों के लिए है।

0

अफैइक में कोई फर्क नहीं पड़ता है, यदि एक्स या तो '', कोई नहीं, 0 या गलत है तो इसे गलत में परिवर्तित कर दिया जाएगा।

+1

और '[]' और '{}' और 'सेट() 'और ... सूची जारी है। (किसी ऑब्जेक्ट को '__nonzero__' विधि (या 'पायथन 3 के लिए' __bool__') के साथ परिभाषित किया जा सकता है और यह' if x' के व्यवहार को नियंत्रित करता है।) – huon

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