क्या गलत == 0 और सत्य == 1 एक कार्यान्वयन विवरण है या क्या यह भाषा की गारंटी है?


244

क्या यह गारंटी है कि False == 0और True == 1, पायथन में (यह मानते हुए कि वे उपयोगकर्ता द्वारा आश्वस्त नहीं हैं)? उदाहरण के लिए, क्या यह किसी भी तरह से गारंटीकृत है कि निम्न कोड हमेशा वही परिणाम देगा, जो कि पायथन के संस्करण (मौजूदा और संभावित रूप से, भविष्य के दोनों) हैं?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

आधिकारिक दस्तावेज के किसी भी संदर्भ की बहुत सराहना की जाएगी!

संपादित करें : जैसा कि कई उत्तरों में उल्लेख किया गया है, से boolविरासत में मिला है int। सवाल इसलिए के रूप में पुनर्निर्मित किया जा सकता है: "प्रलेखन आधिकारिक तौर पर कहना है कि प्रोग्रामर, पूर्णांकों से इनहेरिट बूलियन्स पर भरोसा कर सकते है मूल्यों के साथ 0और1 ?"। यह प्रश्न मजबूत कोड लिखने के लिए प्रासंगिक है जो कार्यान्वयन विवरण के कारण विफल नहीं होगा!


63
@ एस.लॉट: ऊपर दिए गए सवाल पूछने के कई कारण हैं। इस प्रकार, ऐसे उदाहरण हैं जहां बूलियन पर निर्भर होने के कारण पूर्णांक आपके कोड को सरल बनाता है: क्या आपको इसे बदलना होगा? या, आप किसी अन्य व्यक्ति द्वारा लिखे गए कोड में स्थानों को देख सकते हैं जो कि बूलियन्स के पूर्णांक होने पर निर्भर करता है: क्या आप मौजूदा कोड को "ठीक" करने के लिए कोड में संशोधन कर रहे हैं, या क्या आप यह आश्वासन दे सकते हैं कि वर्तमान कोडिंग ध्वनि है ? अन्य उदाहरणों की अधिकता है। अधिक आम तौर पर, खेल के नियमों को जानना अच्छा होता है, ताकि आप इसे अच्छी तरह से खेल सकें और ध्वनि तरीके से कार्यक्रम कर सकें।
एरिक ओ लेबिगॉट

10
@ एस.लॉट: मूल पोस्ट आपकी बात को सटीक रूप से गूँजती है: सवाल अनिवार्य रूप से "क्या यह एक कार्यान्वयन विवरण है?", क्योंकि मैं इस विचार पर पूरी तरह से सहमत हूं कि किसी को कार्यान्वयन विवरण पर निर्भर नहीं होना चाहिए। यदि बूलियन आधिकारिक रूप से ज्ञात मूल्यों के पूर्णांक हैं, तो प्रश्न में कोड कार्यान्वयन विवरणों पर भरोसा नहीं करता है, जो अच्छा है।
एरिक ओ लेबिगॉट

5
@S। लूत: यह जानते हुए कि गलत == 0 और सत्य == 1 यह गिनना आसान बनाता है कि एक अनुक्रम में कितने बल्ड सच हैं: आप बस लिख सकते हैं sum(bool_list)। अन्यथा, आपको लिखना होगा sum(1 for x bool_list if x)
dan04

8
@dan: यह बुलियन की गिनती का एक तरीका है। मैं कहूंगा कि bool_list.count(True)यह अधिक स्पष्ट है; यह भी लगभग 3 गुना तेज है ... :)
एरिक ओ लेबिगॉट

2
@akonsu जवाब दिखाने के रूप में, अजगर बूलियन्स हैं वास्तव में पूर्णांक (की एक विशिष्ट उपवर्ग)। इसके अलावा, अजगर के स्पष्ट रूप से प्रकार हैं; शायद आपका मतलब यह था कि यह "स्टेटिकली टाइप्ड नहीं है"? इसके अलावा, मुझे यकीन नहीं है कि आप "मैं कोड में त्रुटि नहीं बनाऊंगा" से क्या मतलब है। अब, मुझे पूर्णांक के साथ बूलियन को मिश्रण करना कभी पसंद नहीं है, क्योंकि वे वैचारिक रूप से भिन्न हैं, और मुझे बुरा नहीं लगेगा यदि पायथन बूलियन पूर्णांक नहीं थे, लेकिन यह जानते हुए कि वे मान 0 और 1 के साथ उपयोगी हैं।
एरिक ओ लेबिगॉट

जवाबों:


183

पायथन 2.x में इसकी गारंटी नहीं है क्योंकि यह संभव है Trueऔर Falseइसे फिर से असाइन किया जाए। हालांकि, अगर ऐसा होता है, तो बूलियन ट्रू और बूलियन फालसे अभी भी तुलना के लिए ठीक से वापस आ गए हैं।

पायथन 3.x में Trueऔर Falseकीवर्ड हैं और हमेशा 1और के बराबर होंगे 0

पायथन 2 में सामान्य परिस्थितियों में, और हमेशा पायथन 3 में:

Falseऑब्जेक्ट एक प्रकार का है boolजो एक उपवर्ग है int:

object
   |
 int
   |
 bool

यह एकमात्र कारण है कि आपके उदाहरण में, ['zero', 'one'][False]काम करता है। यह ऑब्जेक्ट के साथ काम नहीं करेगा जो पूर्णांक का एक उपवर्ग नहीं है, क्योंकि सूची अनुक्रमण केवल पूर्णांकों के साथ काम करता है, या ऑब्जेक्ट जो एक __index__विधि को परिभाषित करते हैं (धन्यवाद चिह्न-डिकिंसन )।

संपादित करें:

यह वर्तमान पायथन संस्करण का सच है, और उस पायथन का 3. 3. अजगर के लिए डॉक्स 2.6 और पायथन 3 के लिए डॉक्स दोनों कहते हैं:

पूर्णांक दो प्रकार के होते हैं: [...] पूर्णांक (int) [...] बूलियन (बूल)

और बूलियन उपधारा में:

बूलियन: ये सत्य मूल्यों को गलत और सत्य का प्रतिनिधित्व करते हैं [...] बूलियन मान क्रमशः 0 और 1 के मानों की तरह व्यवहार करते हैं, लगभग सभी संदर्भों में, अपवाद यह है कि जब एक स्ट्रिंग में परिवर्तित किया जाता है, तो स्ट्रिंग्स "गलत" या "सत्य" "क्रमशः लौटाए जाते हैं।

पायथन 2 के लिए भी है :

संख्यात्मक संदर्भों में (उदाहरण के लिए जब एक अंकगणितीय ऑपरेटर के तर्क के रूप में उपयोग किया जाता है), वे क्रमशः [0 और 1] पूर्णांक की तरह व्यवहार करते हैं।

तो बूलियन को स्पष्ट रूप से पायथन 2.6 और 3 में पूर्णांक माना जाता है।

इसलिए आप तब तक सुरक्षित हैं जब तक अजगर 4 के साथ नहीं आता। ;-)


2
0 == 0.0 रिटर्न सही है जबकि ['शून्य', 'एक'] [0.0] विफल रहता है। ['शून्य', 'एक'] [गलत] काम करता है क्योंकि बूल इंट का उपवर्ग है। (int .__ उपवर्ग __ () रिटर्न [<टाइप 'बूल'>])
आकर्षक

20
नाइटपिक: कोई भी वस्तु जो एक __index__विधि प्रदान करती है, का उपयोग सूची सूचकांक के रूप में किया जा सकता है; intया उपवर्गों का ही नहीं long
मार्क डिकिंसन

आह हाँ, यह भी है। लेकिन यह बेहतर होगा कि पायथन 3.0 के दस्तावेज़ीकरण से न जोड़ा जाए: 3.0 मर चुका है। :)
मार्क डिकिन्सन

4
पुन: "पायथन 2.x में यह गारंटी नहीं है क्योंकि यह सही और गलत के लिए पुन: असाइन किया जाना संभव है"। IMHO, जबकि यह सच है, जो कोई भी सच या गलत का पुनर्मूल्यांकन करता है, वह जो भी अजीब परिणाम प्राप्त करता है, उसका हकदार है। विशेष रूप से, पुनर्मूल्यांकन से पहले True को संग्रहीत करना और फिर परिणाम की तुलना Rssignment करने के बाद करना होगा। a = True; True = 'i am an idiot'; a == True=> मिथ्या। इस तरह के आश्वासन के अलावा, डिफ़ॉल्ट मानों को 0 और 1 के रूप में मानकीकृत किया जाता है, और मेरा मानना ​​है कि उस पर निर्भर होना आम बात है; उदाहरण के लिए, दो-तत्व सरणी में अनुक्रमणित करें, जहां [0] झूठा मामला रखता है, [1] सच है।
टूलमेकरसेव

मैंने सिर्फ इस तथ्य की एक और आधिकारिक पुष्टि पर ध्यान दिया कि सत्य को 1 और गलत 0 की तरह माना जा सकता है: docs.python.org/2/library/stdtypes.html#boolean-values । मैं इस जवाब में इसे जोड़ रहा हूं।
एरिक ओ लेबिगोट

78

Python 2.3 में नए बूल प्रकार पर चर्चा करने वाले PEP से लिंक करें: http://www.python.org/dev/peps/pep-0285/

बूल को इंट में परिवर्तित करते समय, पूर्णांक मान हमेशा 0 या 1 होता है, लेकिन किसी बूल में इंट को परिवर्तित करते समय, बूलियन मान 0 को छोड़कर सभी पूर्णांकों के लिए सही होता है।

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False

22

पायथन 2.x में, इसकी गारंटी बिल्कुल नहीं है:

>>> False = 5
>>> 0 == False
False

तो यह बदल सकता है। पायथन में 3.x, ट्रू, गलत और कोई भी आरक्षित शब्द नहीं है , इसलिए उपरोक्त कोड काम नहीं करेगा।

सामान्य तौर पर, बूलियन्स के साथ आपको यह मान लेना चाहिए कि जबकि गलत में हमेशा 0 का पूर्णांक मान होगा (इसलिए जब तक आप इसे नहीं बदलते हैं, जैसा कि ऊपर), ट्रू का कोई अन्य मूल्य हो सकता है। मैं जरूरी किसी भी गारंटी पर भरोसा नहीं करता True==1, लेकिन पायथन 3.x पर, यह हमेशा मामला होगा, चाहे जो भी हो।


3
पुन: "ट्रू का कोई और मूल्य हो सकता है। मैं जरूरी नहीं कि किसी भी गारंटी पर भरोसा करूं कि यह सच है == 1"। वास्तव में, आप python.org/dev/peps/pep-0285 के अनुसार True == 1 पर भरोसा कर सकते हैं , और docs.python.org/2/reference/… " क्रमशः बोलियन मान मान 0 और 1 जैसे व्यवहार करते हैं। , लगभग सभी संदर्भों में ... "मैं यह नहीं कह रहा हूँ कि पिय 2 में इसे ओवरराइड करना असंभव है, यह सच है या गलत है, लेकिन मैं यह कह रहा हूं कि जब तक कि आपके प्रोजेक्ट का कोई प्रोग्रामर एक बेवकूफ नहीं है और इस तरह का पुनर्मूल्यांकन नहीं करता है, व्यवहार की गारंटी है।
टूलमेकरसेव

-2

बहुत आसान। जैसा कि बूल एक पूर्णांक का मूल्यांकन एक बूल के रूप में करता है, केवल शून्य एक गलत उत्तर देता है। सभी गैर-शून्य मान, फ़्लोटर्स, पूर्णांक, जिसमें नकारात्मक संख्याएँ शामिल हैं, या आपके पास क्या है, सच हो जाएगा।

यह क्यों उपयोगी है इसका एक अच्छा उदाहरण एक उपकरण की शक्ति स्थिति निर्धारित कर रहा है। किसी भी गैर-शून्य मान पर, शून्य शून्य है। इलेक्ट्रॉनिक रूप से इसे बोलने से समझ में आता है।

मूल्यों के बीच अपेक्षाकृत सही या गलत निर्धारण करने के लिए, आपके पास इसकी तुलना करने के लिए कुछ होना चाहिए। यह तार और संख्या मानों पर लागू, का उपयोग कर ==या !=या <, > >=, <=, आदि

आप एक चर के लिए एक पूर्णांक असाइन कर सकते हैं और फिर उस चर मूल्य के आधार पर सही या गलत प्राप्त कर सकते हैं।


1
प्रश्न यह है कि क्या True == 1 की गारंटी पायथन ने दी है, पूर्णांक के बूलियन मान के बारे में नहीं।
एरिक ओ लेबिगॉट

-3

बस लिखें int(False)और आपको मिलेगा 0, अगर आप टाइप int(True)करेंगे तो यह आउटपुट होगा1


4
इसका केवल यह अर्थ है कि गलत और सत्य int()एक साधारण संख्यात्मक अर्थ के साथ मान्य इनपुट हैं , न कि वे 0 और 1 के समान हैं।
एरिक ओ लेबिगॉट

-5

असत्य एक बूल है। इसका एक अलग प्रकार है। यह 0 से एक अलग वस्तु है जो पूर्णांक है।

0 == Falseसही है क्योंकि झूठी पूर्णांक के लिए डाली जाती है। int (गलत) रिटर्न ०

== ऑपरेटर का अजगर दस्तावेज कहता है (मदद ('==')):

ऑपरेटरों <, >, ==, >=, <=, और !=मूल्यों दो वस्तुओं की तुलना करें। वस्तुओं को एक ही प्रकार की आवश्यकता नहीं है। यदि दोनों संख्याएँ हैं, तो वे एक सामान्य प्रकार में परिवर्तित हो जाती हैं।

एक परिणाम के रूप में गलत तुलना की आवश्यकता के लिए एक पूर्णांक में परिवर्तित हो जाता है। लेकिन यह 0 से अलग है।

>>> 0 is False
False

26
: यह बिल्कुल सही नहीं है boolकी एक उपवर्ग है intतो एक बहुत ही वास्तविक अर्थों में एक bool, है एक पूर्णांक। उदाहरण के लिए, isinstance(True, int)सत्य लौटाता है। और समानता की जांच बूल को एक इंट में परिवर्तित नहीं करती है, क्योंकि कोई रूपांतरण आवश्यक नहीं है: यह सीधे कॉल int.__cmp__करता है। ध्यान दें कि bool.__cmp__ is int.__cmp__मूल्यांकन भी करता है True
मार्क डिकिन्सन

3
-1 इस जवाब के लिए। बूल और इंट (पायथन 2 में) के बीच संबंधों का गलत विवरण। isinstance(True, int)=> सत्य। है यही कारण है, यह सच है है एक पूर्णांक, और रूपांतरण की आवश्यकता नहीं है।
टूलमेकरसेव

मेरे पास एक स्क्रिप्ट थी जो झूठी या एक इंट ... लौटाया while response is Falseकाम किया, और while response == Falseनहीं .. धन्यवाद!
curly_brackets

5
वह 0 is Falseअसत्य आपको कुछ भी नहीं बताता है। अपने इंटरैक्टिव दुभाषिया में x = -10, फिर y = -10, फिर, x is yऔर वह भी झूठा होगा। सिर्फ इसलिए कि ऐसे स्थान पर आशाएँ हैं जहाँ पायथन दुभाषिया कुछ परिस्थितियों में एक ही पूर्णांक वस्तुओं का पुनः उपयोग करता है (पूर्णांकों को पूर्णांक बनाते हुए, छोटे पूर्णांकों को संग्रहीत करते हुए) का अर्थ यह नहीं है कि isजब आप पूर्णांक मान समानता का परीक्षण करना चाहते हैं तो इसका उपयोग किया जाना चाहिए ।
मार्टिज़न पीटरर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.