सी ++ के तहत, वैश्विक/स्थिर चर प्रारंभ आदेश च नामक एक अच्छी तरह से ज्ञात समस्या है iasco, सी ++ के तय करने में असमर्थता जो वैश्विक/स्थिर चर संकलन इकाइयों में पहले प्रारंभ किया जाएगा के कारण,
मुझे लगता है कि बयान ++ पायथन और सी के बीच एक महत्वपूर्ण अंतर पर प्रकाश डाला गया: अजगर में, ऐसी कोई बात के रूप में अलग है संकलन इकाइयों। इसका मतलब है कि, सी ++ (जैसा कि आप जानते हैं) में, दो अलग-अलग स्रोत फ़ाइलों को एक-दूसरे से पूरी तरह से स्वतंत्र रूप से संकलित किया जा सकता है, और इस प्रकार यदि आप फ़ाइल ए में एक रेखा की तुलना करते हैं और फ़ाइल बी में एक पंक्ति की तुलना करते हैं, तो कुछ भी नहीं कहना है आप जो कार्यक्रम में पहले रखा जाएगा। यह कई धागे के साथ स्थिति की तरह है: आप यह नहीं कह सकते कि थ्रेड 1 में कोई विशेष कथन थ्रेड 2 में किसी विशेष कथन से पहले या उसके बाद निष्पादित किया जाएगा या नहीं। आप कह सकते हैं कि सी ++ प्रोग्राम समानांतर में संकलित किए गए हैं।
इसके विपरीत, पायथन में, निष्पादन एक फ़ाइल के शीर्ष पर शुरू होता है और फ़ाइल में प्रत्येक कथन के माध्यम से एक अच्छी तरह से परिभाषित क्रम में आगे बढ़ता है, जहां वे आयात किए जाते हैं उन बिंदुओं पर अन्य फ़ाइलों को ब्रांच करते हैं।वास्तव में, आप लगभग import
निर्देश #include
के रूप में सोच सकते हैं, और इस तरह आप प्रोग्राम में सभी स्रोत फ़ाइलों में कोड की सभी पंक्तियों के निष्पादन के आदेश की पहचान कर सकते हैं। (ठीक है, यह उससे थोड़ा अधिक जटिल है, क्योंकि मॉड्यूल केवल आयात किए जाने पर पहली बार निष्पादित हो जाता है, और अन्य कारणों से।) यदि सी ++ प्रोग्राम समानांतर में संकलित किए जाते हैं, तो पाइथन प्रोग्राम को क्रमशः व्याख्या किया जाता है।
आपका प्रश्न पायथन में मॉड्यूल के गहन अर्थ पर भी छूता है। एक पायथन मॉड्यूल - जो कुछ भी है जो एक .py
फ़ाइल में है - एक वास्तविक वस्तु है। एक स्रोत स्रोत में "वैश्विक" दायरे में घोषित सब कुछ वास्तव में उस मॉड्यूल ऑब्जेक्ट की विशेषता है। पायथन में कोई वास्तविक वैश्विक दायरा नहीं है। (पायथन प्रोग्रामर अक्सर "वैश्विक" कहते हैं और वास्तव में भाषा में global
कीवर्ड है, लेकिन यह हमेशा वर्तमान मॉड्यूल के शीर्ष स्तर को संदर्भित करता है।) मैं देख सकता था कि उपयोग करने के लिए एक अजीब अवधारणा है एक सी ++ पृष्ठभूमि से आ रहा है। जावा से आने वाले कुछ लोगों ने मेरे लिए उपयोग किया, और इस संबंध में जावा सी ++ की तुलना में पाइथन के समान ही है।
मुझे लगता है कि अजगर में यह किसी भी विचार है कि क्या यह शुरू कर दिया गया/परिभाषित या नहीं बिना एक चर का उपयोग करने के लिए पूरी तरह से सामान्य है उल्लेख होगा (वहाँ भी जावा में कोई वैश्विक गुंजाइश है)। खैर, शायद सामान्य नहीं, लेकिन कम से कम उचित परिस्थितियों में स्वीकार्य है। पायथन में, एक अपरिभाषित चर का उपयोग करने की कोशिश कर रहा है NameError
; आप सी या सी ++ में मनमाने ढंग से व्यवहार नहीं कर सकते हैं, ताकि आप आसानी से स्थिति को संभाल सकें।
try:
duck.quack()
except NameError:
pass
जो अगर duck
मौजूद नहीं है कुछ नहीं करता है: आप इस पैटर्न देख सकते हैं। वास्तव में, क्या आप और अधिक सामान्यतः देखेंगे
try:
duck.quack()
except AttributeError:
pass
अगर duck
एक विधि quack
नामित नहीं है जो कुछ नहीं करता है। (AttributeError
किसी ऑब्जेक्ट की विशेषता तक पहुंचने का प्रयास करते समय आपको मिली त्रुटि होती है, लेकिन ऑब्जेक्ट में उस नाम से कोई विशेषता नहीं होती है।) यह पाइथन में एक प्रकार की जांच के लिए गुजरता है: हम समझते हैं कि अगर हम सभी बतख करने के लिए बतख की ज़रूरत है, हम इसे क्वैक करने के लिए कह सकते हैं, और यदि ऐसा होता है, तो हमें परवाह नहीं है कि यह वास्तव में एक बतख है या नहीं। (यह बतख टाइपिंग ;-) कहा जाता है
यह निश्चित रूप से मेरे द्वारा पोस्ट किए गए मुद्दे की पूरी तरह से व्याख्या है, बिल्कुल बिंदु पर! धन्यवाद! – Lin