python - एक कथन में शुरू किए गए चर का दायरा क्या है?




variables if-statement (5)

आप कमांड लाइन से इस कोड को निष्पादित कर रहे हैं इसलिए if स्थिति सत्य है और x सेट है। की तुलना करें:

>>> if False:
    y = 42


>>> y
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    y
NameError: name 'y' is not defined

मैं पाइथन के लिए नया हूं, इसलिए यह शायद एक साधारण स्कॉइंग प्रश्न है। पाइथन फ़ाइल (मॉड्यूल) में निम्न कोड मुझे थोड़ा उलझन में डाल रहा है:

if __name__ == '__main__':
    x = 1

print x

अन्य भाषाओं में मैंने काम किया है, यह कोड अपवाद फेंक देगा, क्योंकि x चर वैधानिक के लिए स्थानीय है और इसके बाहर मौजूद नहीं होना चाहिए। लेकिन यह कोड निष्पादित करता है, और प्रिंट करता है 1. क्या कोई इस व्यवहार को समझा सकता है? क्या मॉड्यूल ग्लोबल / पूरे मॉड्यूल में उपलब्ध सभी चर?


जैसे एली ने कहा, पायथन को परिवर्तनीय घोषणा की आवश्यकता नहीं है। सी में आप कहेंगे:

int x;
if(something)
    x = 1;
else
    x = 2;

लेकिन पायथन घोषणा में अंतर्निहित है, इसलिए जब आप एक्स को असाइन करते हैं तो इसे स्वचालित रूप से घोषित किया जाता है। ऐसा इसलिए है क्योंकि पाइथन गतिशील रूप से टाइप किया गया है - यह स्थिर रूप से टाइप की गई भाषा में काम नहीं करेगा, क्योंकि उपयोग किए गए पथ के आधार पर, एक चर का उपयोग किए बिना उपयोग किया जा सकता है। यह एक स्थिर टाइप की गई भाषा में संकलन समय पर पकड़ा जाएगा, लेकिन गतिशील रूप से टाइप की गई भाषा के साथ इसकी अनुमति है।

एकमात्र कारण यह है कि एक स्थिर रूप से टाइप की गई भाषा इस समस्या के कारण बयानों के बाहर चर घोषित करने के लिए सीमित है। गतिशील गले लगाओ!


पायथन में दायरा इस आदेश का पालन करता है:

  • स्थानीय दायरे खोजें

  • किसी भी संलग्न कार्यों के दायरे को खोजें

  • वैश्विक दायरे खोजें

  • बिल्ट-इन्स खोजें

( source )

ध्यान दें कि if और अन्य लूपिंग / ब्रांचिंग संरचनाएं सूचीबद्ध नहीं हैं - केवल कक्षाएं, कार्य, और मॉड्यूल पाइथन में दायरा प्रदान करते हैं, इसलिए ब्लॉक के बाहर किसी भी प्रकार के ब्लॉक के रूप में किसी भी प्रकार के ब्लॉक के रूप में घोषित किया गया है। चर संकलन समय पर चर की जांच नहीं की जाती है, यही कारण है कि अन्य भाषाएं अपवाद फेंकती हैं। पायथन में, जब तक आपको इसकी आवश्यकता होती है वैरिएबल मौजूद होता है, तब तक कोई अपवाद नहीं फेंक दिया जाएगा।


सी जैसी भाषाओं के विपरीत, एक पायथन वैरिएबल पूरे कार्य (या वर्ग, या मॉड्यूल) के दायरे में है जहां यह दिखाई देता है, न कि केवल "ब्लॉक" में। ऐसा लगता है कि आपने फ़ंक्शन (या कक्षा, या मॉड्यूल) के शीर्ष पर int x घोषित किया है, सिवाय इसके कि पाइथन में आपको चर घोषित करने की आवश्यकता नहीं है।

ध्यान दें कि चर x का अस्तित्व केवल रनटाइम पर चेक किया जाता है - यानी, जब आप print x कथन प्राप्त करते हैं। यदि __name__ "__main__" बराबर नहीं था तो आपको अपवाद मिलेगा NameError: name 'x' is not defined


हां, वे एक ही "स्थानीय दायरे" में हैं, और वास्तव में इस तरह के कोड पायथन में आम है:

if condition:
  x = 'something'
else:
  x = 'something else'

use(x)

ध्यान दें कि x को इस शर्त से पहले घोषित या प्रारंभ नहीं किया गया है, जैसे कि यह सी या जावा में होगा, उदाहरण के लिए।

दूसरे शब्दों में, पायथन में ब्लॉक-स्तरीय स्कोप नहीं हैं। उदाहरण के साथ, सावधान रहें

if False:
    x = 3
print(x)

जो स्पष्ट रूप से NameError अपवाद उठाएगा।





local-variables