2012-10-04 20 views
13

बुलियन मूल्यों के साथ सूची पर अनुक्रमण करना ठीक काम करता है। हालांकि सूचकांक एक पूर्णांक होना चाहिए।बूलियन मूल्यों के साथ सूची में पायथन बूल और int तुलना और अनुक्रमण पर

>>> l = [1,2,3,4,5,6] 
>>> 
>>> l[False] 
1 
>>> l[True] 
2 
>>> l[False + True] 
2 
>>> l[False + 2*True] 
3 
>>> 
>>> l['0'] 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 
>>> type(True) 
<type 'bool'> 

जब मैं करने की कोशिश की l['0'] यह त्रुटि है कि int प्रकार सूचकांकों में उम्मीद और कहा कि स्पष्ट है मुद्रित:

के बाद क्या मैं कंसोल में करने की कोशिश की है। फिर, 'True' और होने के बावजूद, सूची पर अनुक्रमण ठीक काम करता है और स्वचालित रूप से इसे int प्रकार में परिवर्तित करता है और ऑपरेशन करता है।

कृपया बताएं कि आंतरिक रूप से क्या हो रहा है। मैं पहली बार प्रश्न पोस्ट कर रहा हूं, इसलिए कृपया मुझे किसी भी गलती के लिए क्षमा करें।

उत्तर

20

क्या हो रहा है कि बूलियन वास्तव में पूर्णांक हैं। सच है 1 और गलत है 0. बूल int का एक उप प्रकार है।

>>> isinstance(True, int) 
True 
>>> issubclass(bool, int) 
True 

तो यह उन्हें पूर्णांक में परिवर्तित नहीं कर रहा है, यह सिर्फ उन्हें पूर्णांक के रूप में उपयोग कर रहा है।

(बूल ऐतिहासिक कारणों के लिए चींटियां हैं। पाइथन में एक बूल प्रकार मौजूद होने से पहले, लोगों ने पूर्णांक का उपयोग करने के लिए पूर्णांक 0 का उपयोग किया और 1 का मतलब सही था। इसलिए जब उन्होंने एक बूल प्रकार जोड़ा, तो उन्होंने बूलियन मानों को पूर्णांक में पूर्णांक बना दिया पुराने कोड है कि इन पूर्णांक मूल्यों इस्तेमाल किया साथ पश्चगामी संगतता बनाए रखने के लिए। उदाहरण http://www.peterbe.com/plog/bool-is-int के लिए देखें।)

>>> help(True) 
Help on bool object: 

class bool(int) 
| bool(x) -> bool 
| 
| Returns True when the argument x is true, False otherwise. 
| The builtins True and False are the only two instances of the class bool. 
| The class bool is a subclass of the class int, and cannot be subclassed. 
+2

+1, मैंने कुछ सीखा। पता नहीं था 'बूल' 'int' का उप-वर्ग था। – nneonneo

+0

मैं अभी भी इस पोस्ट के माध्यम से गया था [लिंक] http://stackoverflow.com/questions/3174392/is-it-pythonic-to-use-bools-as-ints/3175293#3175293) बहुत बहुत धन्यवाद। – Somesh

2

... Booleans सादा पूर्णांकों का एक उप प्रकार हैं।

Source

जैसा कि आप देख सकते हैं, False0 और True1 है।

2

पायथन बुलियन की कमी के लिए का उपयोग किया गया, हमने केवल पूर्णांक का उपयोग किया, 0 गलत और सत्य के लिए कोई अन्य पूर्णांक। तो जब भाषा में बूलियन जोड़े गए थे, तो मूल्य और झूठी मानों को पीछे की संगतता में सहायता के लिए, दुभाषिया द्वारा पूर्णांक मान 0 और 1 के रूप में देखा जा सकता है। आंतरिक रूप से, वे int के उप-वर्ग हैं।

दूसरे शब्दों में, निम्नलिखित समीकरण सच हैं:

>>> False == 0 
True 
>>> True == 1 
True 

और के रूप में आप पता चला:

>>> True * 3 
3 

हालांकि यह तार विस्तार नहीं करता है।