पायथन 3 समय के संबंध में कोई गहन उत्तर नहीं था, इसलिए मैंने यहां एक उत्तर दिया। यहाँ जो कुछ वर्णित किया गया है, उनमें से अधिकांश पायथन 3 प्रलेखन के नामों के 4.2.2 संकल्प में विस्तृत है ।
जैसा कि अन्य उत्तरों में प्रदान किया गया है, स्थानीय, एनक्लोजिंग, ग्लोबल और बिलिन के लिए 4 मूल स्कोप, लेगबी हैं। उन लोगों के अलावा, एक विशेष गुंजाइश है, वर्ग निकाय , जिसमें कक्षा के भीतर परिभाषित तरीकों के लिए एक संलग्न गुंजाइश शामिल नहीं है; क्लास बॉडी के भीतर कोई भी असाइनमेंट वहाँ से वेरिएबल को बॉडी बॉन्ड में बांधा जाता है।
विशेष रूप से, कोई ब्लॉक स्टेटमेंट, इसके अलावा def
और class
, एक वैरिएबल स्कोप बनाएँ। पायथन 2 में एक सूची बोध एक चर गुंजाइश नहीं बनाता है, हालांकि पायथन 3 में सूची समझ के भीतर लूप चर एक नए दायरे में बनाया गया है।
वर्ग निकाय की विशिष्टताओं को प्रदर्शित करने के लिए
x = 0
class X(object):
y = x
x = x + 1 # x is now a variable
z = x
def method(self):
print(self.x) # -> 1
print(x) # -> 0, the global x
print(y) # -> NameError: global name 'y' is not defined
inst = X()
print(inst.x, inst.y, inst.z, x) # -> (1, 0, 1, 0)
इस प्रकार फंक्शन बॉडी के विपरीत, आप वैरिएबल को उसी नाम से वर्ग बॉडी में फिर से असाइन कर सकते हैं, उसी नाम के साथ क्लास वेरिएबल प्राप्त करने के लिए; इस नाम पर आगे के लुकअप इसके बजाय क्लास वेरिएबल के लिए हल करते हैं।
पायथन के कई नए लोगों के लिए एक बड़ा आश्चर्य यह है कि एक for
लूप एक वैरिएबल स्कोप नहीं बनाता है। पायथन 2 में सूची की समझ या तो गुंजाइश नहीं बनाती है (जबकि जनरेटर और तानाशाह समझ भी करते हैं!) इसके बजाय वे फ़ंक्शन या वैश्विक दायरे में मूल्य को लीक करते हैं:
>>> [ i for i in range(5) ]
>>> i
4
बोधगम्य का उपयोग एक चालाक (या भयानक के रूप में किया जा सकता है) यदि आप पाइथन 2 में लैम्ब्डा अभिव्यक्ति के भीतर परिवर्तनीय वैरिएबल बनाने का तरीका करते हैं - एक लैम्ब्डा अभिव्यक्ति एक वैरिएबल स्कोप बनाता है, जैसे कि def
स्टेटमेंट होगा, लेकिन नंबा के भीतर किसी भी स्टेटमेंट की अनुमति नहीं है। पायथन में एक बयान होने का मतलब है कि लंबोदर में कोई भी चर असाइनमेंट की अनुमति नहीं है, लेकिन एक सूची एक अभिव्यक्ति ...
पायथन 3 में यह व्यवहार तय किया गया है - कोई भी अभिव्यक्ति के भाव या जनरेटर रिसाव चर नहीं हैं।
वैश्विक वास्तव में मॉड्यूल गुंजाइश का मतलब है; मुख्य अजगर मॉड्यूल है __main__
; सभी आयातित मॉड्यूल sys.modules
चर के माध्यम से सुलभ हैं ; उपयोग करने के लिए उपयोग करने के __main__
लिए sys.modules['__main__']
, या import __main__
; यह पूरी तरह से वहाँ की विशेषताओं तक पहुँचने और असाइन करने के लिए स्वीकार्य है; वे मुख्य मॉड्यूल के वैश्विक दायरे में चर के रूप में दिखाई देंगे।
यदि किसी नाम को कभी भी मौजूदा दायरे में (वर्ग के दायरे को छोड़कर) सौंपा गया है, तो उसे उस दायरे से संबंधित माना जाएगा, अन्यथा इसे किसी भी संलग्न दायरे से संबंधित माना जाएगा जो चर को असाइन करता है (यह असाइन नहीं किया जा सकता है) अभी तक, या नहीं), या अंत में वैश्विक गुंजाइश। यदि चर को स्थानीय माना जाता है, लेकिन इसे अभी तक सेट नहीं किया गया है, या हटा दिया गया है, तो चर मान को पढ़ने से परिणाम होगा UnboundLocalError
, जो एक उपवर्ग है NameError
।
x = 5
def foobar():
print(x) # causes UnboundLocalError!
x += 1 # because assignment here makes x a local variable within the function
# call the function
foobar()
गुंजाइश यह घोषित कर सकती है कि वह वैश्विक कीवर्ड के साथ वैश्विक (मॉड्यूल स्कोप) चर को संशोधित करना चाहती है:
x = 5
def foobar():
global x
print(x)
x += 1
foobar() # -> 5
print(x) # -> 6
यह भी संभव है, भले ही इसे परिक्षेत्र के दायरे में छाया हुआ हो:
x = 5
y = 13
def make_closure():
x = 42
y = 911
def func():
global x # sees the global value
print(x, y)
x += 1
return func
func = make_closure()
func() # -> 5 911
print(x, y) # -> 6 13
अजगर 2 में एनक्लोजिंग दायरे में मूल्य को संशोधित करने का कोई आसान तरीका नहीं है; आमतौर पर यह एक परिवर्तनशील मूल्य होने पर नकली होता है, जैसे कि 1 की लंबाई वाली सूची:
def make_closure():
value = [0]
def get_next_value():
value[0] += 1
return value[0]
return get_next_value
get_next = make_closure()
print(get_next()) # -> 1
print(get_next()) # -> 2
हालांकि अजगर 3 में, nonlocal
बचाव के लिए आता है:
def make_closure():
value = 0
def get_next_value():
nonlocal value
value += 1
return value
return get_next_value
get_next = make_closure() # identical behavior to the previous example.
nonlocal
प्रलेखन का कहना है कि
एक गैर-कथन में सूचीबद्ध नाम, एक वैश्विक कथन में सूचीबद्ध लोगों के विपरीत, एक संलग्न दायरे में पहले से मौजूद बाइंडिंग का उल्लेख करना चाहिए (जिस क्षेत्र में एक नया बंधन बनाया जाना चाहिए, उसे स्पष्ट रूप से निर्धारित नहीं किया जा सकता है)।
यानी nonlocal
हमेशा अंतरतम बाहरी गैर-वैश्विक गुंजाइश को संदर्भित करता है जहां नाम को बाध्य किया गया है (यानी असाइन किया गया है, जिसमें for
लक्ष्य चर के रूप में उपयोग किया जाता है , with
खंड में, या फ़ंक्शन पैरामीटर के रूप में)।
कोई भी वैरिएबल जिसे वर्तमान स्कोप के लिए स्थानीय नहीं माना जाता है, या कोई भी स्कोपिंग स्कोप, एक ग्लोबल वैरिएबल है। मॉड्यूल वैश्विक शब्दकोश में एक वैश्विक नाम देखा जाता है; यदि नहीं मिला है, तो वैश्विक निर्मित मॉड्यूल से देखा जाता है; मॉड्यूल का नाम अजगर 2 से अजगर 3 में बदल दिया गया था; अजगर 2 में यह था __builtin__
और अजगर 3 में इसे अब कहा जाता है builtins
। यदि आप निर्मित मॉड्यूल की एक विशेषता को असाइन करते हैं, तो यह किसी भी मॉड्यूल के लिए एक पठनीय वैश्विक चर के रूप में दिखाई देगा, जब तक कि मॉड्यूल उन्हें उसी नाम के साथ अपने स्वयं के वैश्विक चर के साथ छाया नहीं देता।
अंतर्निहित मॉड्यूल पढ़ना भी उपयोगी हो सकता है; मान लें कि आप फ़ाइल के कुछ हिस्सों में अजगर 3 स्टाइल प्रिंट फ़ंक्शन चाहते हैं, लेकिन फ़ाइल के अन्य हिस्से अभी भी print
स्टेटमेंट का उपयोग करते हैं । पायथन 2.6-2.7 में आप पायथन 3 print
फ़ंक्शन को पकड़ सकते हैं :
import __builtin__
print3 = __builtin__.__dict__['print']
from __future__ import print_function
वास्तव में आयात नहीं करता है print
अजगर 2 में समारोह कहीं भी - के बजाय यह सिर्फ के लिए पार्स करने के नियमों को निष्क्रिय print
वर्तमान मॉड्यूल में बयान, हैंडलिंग print
किसी अन्य चर पहचानकर्ता की तरह, और इस तरह की इजाजत दी print
समारोह builtins में देखा जा।