लेकिन यह उत्तर कहता है कि समस्या x को असाइन करने के साथ है। यदि यह है, तो प्रिंटिंग इसे ठीक काम करना चाहिए, है ना?
आपको उस क्रम को समझना होगा जिसमें चीजें होती हैं। आपके पायथन कोड को संकलित और निष्पादित करने से पहले, पार्सर नामक कुछ को पाइथन कोड के माध्यम से पढ़ता है और सिंटैक्स की जांच करता है। एक और चीज पार्सर स्थानीय चर के रूप में चिह्नित चर है। जब पार्सर स्थानीय दायरे में कोड में असाइनमेंट देखता है, तो असाइनमेंट के लेफ्टथेंड पक्ष पर चर को स्थानीय के रूप में चिह्नित किया जाता है। उस समय, अभी तक कुछ भी संकलित नहीं किया गया है - अकेले निष्पादित होने दें, और इसलिए कोई असाइनमेंट नहीं होता है; चर को केवल स्थानीय चर के रूप में चिह्नित किया जाता है।
पार्सर समाप्त होने के बाद, कोड संकलित और निष्पादित किया गया है। जब निष्पादन प्रिंट बयान तक पहुँच जाता है:
def main():
x = 10 #<---x in enclosing scope
def f():
print x #<-----
x = x + 1 #<-- x marked as local variable inside the function f()
प्रिंट बयान लगता है कि यह आगे जाना है और प्रिंट (LEGB देखने की प्रक्रिया में 'ई') गुंजाइश enclosing में एक्स चाहिए। हालांकि, क्योंकि पार्सर ने पहले एक्स को स्थानीय चर के रूप में चिह्नित किया है(), पाइथन एक्स को देखने के लिए स्थानीय स्कोप (एलईजीबी लुकअप प्रक्रिया में 'एल') से आगे नहीं बढ़ता है।चूंकि एक्स को 'प्रिंट एक्स' निष्पादित समय पर स्थानीय दायरे में असाइन नहीं किया गया है, इसलिए पाइथन एक त्रुटि को थूकता है।
ध्यान दें कि यहां तक कि यदि कोई असाइनमेंट होता है तो कोड कभी निष्पादित नहीं होगा, पार्सर अभी भी स्थानीय चर के रूप में असाइनमेंट के बाईं ओर चर को चिह्नित करता है। पार्सर को इस बारे में कोई जानकारी नहीं है कि चीजें कैसे निष्पादित होंगी, इसलिए यह आपकी फ़ाइल में सिंटैक्स त्रुटियों और स्थानीय चर के लिए अंधेरे से खोज करती है - यहां तक कि कोड में जो कभी निष्पादित नहीं कर सकता है। यहाँ है कि के कुछ उदाहरण हैं: जब स्थानीय चर अंकन
def dostuff():
x = 10
def f():
print x
if False: #The body of the if will never execute...
a b c #...yet the parser finds a syntax error here
return f
f = dostuff()
f()
--output:--
File "1.py", line 8
a b c
^
SyntaxError: invalid syntax
पार्सर एक ही बात करता है:
def dostuff():
x = 10
def f():
print x
if False: #The body of the if will never execute...
x = 0 #..yet the parser marks x as a local variable
return f
f = dostuff()
f()
अब देखो क्या होता है जब आपको लगता है कि पिछले कार्यक्रम क्रियान्वित:
Traceback (most recent call last):
File "1.py", line 11, in <module>
f()
File "1.py", line 4, in f
print x
UnboundLocalError: local variable 'x' referenced before assignment
जब कथन 'प्रिंट एक्स' निष्पादित होता है, क्योंकि पार्सर ने स्थानीय चर के रूप में एक्स को चिह्नित किया है तो एक्स के लिए लुकअप स्थानीय दायरे पर बंद हो जाता है।
वह 'फीचर' पायथन के लिए अद्वितीय नहीं है - यह अन्य भाषाओं में भी होता है।
सरणी उदाहरण के लिए, जब आप लिखते हैं:
x[0] = x[0] + 1
कि एक सरणी नामित एक्स ऊपर देखने जाकर उसका पहला तत्व के लिए कुछ आवंटित करने के लिए अजगर बताता है। चूंकि स्थानीय दायरे में x नामक किसी भी चीज़ के लिए कोई असाइनमेंट नहीं है, इसलिए पार्सर x को स्थानीय चर के रूप में चिह्नित नहीं करता है।
+1 संकलक का उल्लेख करने के लिए +1 कैसे स्कॉप्स काम करता है। मेरे लिए नया दृष्टिकोण। –