2013-04-03 11 views
5

सबसे पहले, ध्यान दें कि मैं समझता हूँ कि == दो भाव की तुलना के लिए प्रयोग किया जाता है, जबकि = एक चर के लिए एक मूल्य निर्दिष्ट करने के लिए प्रयोग किया जाता है। हालांकि, पाइथन न्यूनतम वाक्यविन्यास आवश्यकताओं के साथ ऐसी स्वच्छ भाषा है, यह कुल्हाड़ी के लिए एक आसान ऑपरेटर की तरह लगता है। इसके अलावा मैं बहस या चर्चा शुरू करने की कोशिश नहीं कर रहा हूं, बल्कि सीख रहा हूं कि प्रोग्रामिंग के बारे में मेरा ज्ञान सुधारने के लिए कुछ ऐसा है जो मुझे याद आ रहा है।

बस के रूप में (अजगर में) हम भाषा इस सौंपा मूल्य के आधार पर निर्धारित करता है एक पूर्णांक, या एक स्ट्रिंग होना करने के लिए एक चर घोषित करने के लिए की जरूरत नहीं है, और, क्यों नहीं 'अगर' बयान बस निर्धारित करता है कि = एक तुलना है, एक असाइनमेंट नहीं?

एक और उदाहरण है कि अजगर अन्य भाषाओं में {} के कई और [] से छुटकारा मिला और बस, खरोज इस्तेमाल किया क्योंकि इंडेंट और ब्रेसिज़ का उपयोग कर अनावश्यक है। मुझे लगता है कि if foo == goo: भी अनावश्यक है। लेकिन शायद कुछ ऐसा है जो मुझे अभी तक पता नहीं है। इसलिए सवाल!क्या == 'ऑपरेटर के प्रयोजन जब बनाम' = 'मानों की तुलना है?

a = b == c 

और भी कई काम:

+0

यह हास्यास्पद है, क्योंकि मैं तो बस इस वीडियो को देखा था: [टिम पीटर्स के साथ साक्षात्कार] (http://www.youtube.com/watch?v=1wAOy88WxmY) जहां उन्होंने कहा कि वह अजगर 0.9.1 के साथ काम करना शुरू किया जहां ' = 'संकेत वास्तव में तुलना और असाइनमेंट – jamylak

+0

दोनों के लिए उपयोग किया गया था अब मुझे यह देखने की ज़रूरत है ... मुझे नहीं पता था कि यह कभी भी मामला था। बेशक, जब मैंने अजगर के साथ काम करना शुरू किया, हम python2.6 पर थे ... तब से बहुत कुछ नहीं बदला गया है (python3.something पहले से ही बाहर था ...) – mgilson

उत्तर

11

एक बहुत ही सरल कारण यह है कि अजगर बूलियन अभिव्यक्ति की अनुमति देता है

a = b = c 

पहले मामले में, a सौंप दिया जाता है एक बूलियन मान * (True या False) b और c के आधार पर बराबर हैं। दूसरे मामले में, a और b एक ही वस्तु (c) को संदर्भित अंत। स्पष्ट रूप से आप केवल एक ही ऑपरेटर के साथ दोनों का समर्थन नहीं कर सकते हैं।

मुझे लगता सकता है कि आप (सिद्धांत रूप में) = ओवरलोड केवल if बयानों के भीतर (काम वहाँ की अनुमति नहीं है के बाद से), लेकिन यह भ्रामक मिलेगा - विशेष रूप से C से आने वाले लोगों के लिए जहां an assignment is allowed in an if statement. ज़ेन फिर से जीत जाता है (" अंतर्निहित से स्पष्ट बेहतर है ")।


  • यह वास्तव में एक बूलियन मान होना करने के लिए नहीं है। यह वास्तव में जो कुछ भी a के __eq__ विधि (या b के __eq__ यदि पूर्व रिटर्न NotImplemented) द्वारा दिया जाता है - सबसे वस्तुओं एक बूलियन लौटने के लिए, लेकिन कुछ नहीं है (numpy.ndarray एक आम वस्तु जो एक __eq__ है जो उदाहरण के लिए एक और ndarray देता है)।
+2

उस अर्थ में, एक पंक्ति जिसमें 'बी == सी 'एक पूर्ण बयान देगा, और निश्चित रूप से यह 'बी = सी' से अलग है। +1 – heltonbiker

+0

धन्यवाद। समझ में आता है। और मैं सहमत हूं, आप केवल बयानों के लिए इसे बदलना नहीं चाहेंगे। यह अजगर को लगातार रखने के अत्यधिक सिद्धांत के खिलाफ होगा। – user2218093

+0

@heltonbiker - यह एक पूरी तरह से मान्य बिंदु है, खासकर इंटरैक्टिव प्रॉम्प्ट से जहां 'b == c'' प्रिंट repr (b == c) 'जैसा ही है। और निश्चित रूप से, यह मत भूलना कि पाइथन की गतिशील प्रकृति के कारण, यह जानना मुश्किल है कि 'बी' और' सी' रनटाइम पर क्या हैं। उनमें से एक साइड इफेक्ट्स या व्हाट्नॉट के साथ वास्तव में एक मजेदार '__eq__' हो सकता है, इसलिए अभिव्यक्ति' बी == सी' (सिद्धांत रूप में) "उपयोगी" हो सकती है भले ही आप इंटरैक्टिव प्रॉम्प्ट पर न हों। – mgilson

5

दो ऑपरेटरों ओवरलैप कर सकते हैं। उदाहरण के लिए,

a = b = c 

जो सेट a और c को b दोनों, और

a = b == c 

जो या तो True या Falseb और c बराबर हैं, चाहे के आधार पर करने के लिए a सेट पर विचार करें।


आम तौर पर, अजगर वाक्य रचना है कि यहां तक ​​कि संभवतः अस्पष्ट सरल होने के लिए अनुमति देने के लिए पार्सर से बचने के लिए प्रयास करता है। यहां तक ​​कि यदि उपरोक्त अस्पष्टता का समाधान किया जा सकता है, तो इसमें कई विशेष मामलों को जोड़ने और आम तौर पर पार्सर को जटिलता जोड़ने की आवश्यकता होगी। दो ऑपरेटरों को अलग रखना इस मुद्दे से अच्छी तरह से बचाता है।

+0

धन्यवाद। समझ में आता है। – user2218093

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