पायथन 3 समय से संबंधित कोई गहन जवाब नहीं था, इसलिए मैंने यहां एक जवाब दिया।
जैसा कि अन्य उत्तरों में प्रदान किया गया है, स्थानीय, संलग्न, वैश्विक और बिल्टिन के लिए 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)
इस प्रकार वर्ग शरीर के peculiarities प्रदर्शित करने के लिए विपरीत समारोह शरीर में, आप चर एक ही नाम के लिए कक्षा शरीर में पुन: असाइन कर सकते हैं, एक ही नाम के साथ एक वर्ग चर प्राप्त करने के लिए; इस नाम पर आगे लुकअप के बजाय कक्षा चर के लिए हल करें।
पायथन के लिए कई नए लोगों के लिए अधिक से अधिक आश्चर्य में से एक है कि एक for
पाश एक चर गुंजाइश नहीं बना होता है। पायथन 2 में सूची की समझ या तो एक गुंजाइश नहीं बनाती है (जबकि जनरेटर और dict समझें करते हैं!) इसके बजाय वे या समारोह में मूल्य वैश्विक क्षेत्र रिसाव:
>>> [ i for i in range(5) ]
>>> i
4
comprehensions या यदि आप होगा एक चालाक के रूप में इस्तेमाल किया जा सकता (भयंकर) जिस तरह से अजगर 2 में लैम्ब्डा भाव भीतर परिवर्तनीय चर बनाने के लिए - एक लैम्ब्डा अभिव्यक्ति एक चरणीय दायरा बनाती है, जैसे def
कथन, लेकिन लैम्ब्डा के भीतर कोई बयान नहीं है। पाइथन में एक कथन होने का मतलब है कि लैम्ब्डा में कोई वैरिएबल असाइनमेंट नहीं है, लेकिन एक सूची समझ एक अभिव्यक्ति है ...
यह व्यवहार पायथन 3 में तय किया गया है - कोई समझ अभिव्यक्ति या जनरेटर लीक चर नहीं।
वैश्विक वास्तव में मॉड्यूल का दायरा है; मुख्य पायथन मॉड्यूल __main__
है; सभी आयातित मॉड्यूल sys.modules
चर के माध्यम से सुलभ हैं; __main__
तक पहुंच प्राप्त करने के लिए कोई sys.modules['__main__']
, या import __main__
का उपयोग कर सकता है; यह वहां पहुंचने और असाइन करने के लिए पूरी तरह से स्वीकार्य है; वे मुख्य मॉड्यूल के वैश्विक दायरे में चर के रूप में दिखाई देंगे।
एक नाम कभी (वर्ग दायरे को छोड़कर) वर्तमान क्षेत्र में करने के लिए सौंपा गया है, तो यह है कि गुंजाइश से संबंधित विचार किया जाएगा, अन्यथा यह किसी भी संलग्न गुंजाइश है कि करने के लिए प्रदान करती है से संबंधित करने के लिए विचार किया जाएगा चर (यह अभी तक असाइन नहीं किया जा सकता है, या बिल्कुल नहीं), या अंत में वैश्विक दायरा। यदि चर को स्थानीय माना जाता है, लेकिन यह अभी तक सेट नहीं है, या हटा दिया गया है, तो वैरिएबल मान पढ़ने से UnboundLocalError
होगा, जो NameError
का उप-वर्ग है।
x = 5
def foobar()
print(x) # UnboundLocalError!
x += 1 # assignment here makes x a local variable!
गुंजाइश घोषणा कर सकते हैं यह स्पष्ट रूप से वैश्विक कीवर्ड के साथ वैश्विक (मॉड्यूल गुंजाइश) अलग-अलग संशोधित करने के लिए चाहता है:
x = 5
def foobar():
global x
print(x) # -> 5
x += 1
foobar()
print(x) # -> 6
यह भी संभव है, भले ही यह गुंजाइश enclosing में छायांकित किया गया था:
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() # -> print 5 911
print(x, y) # -> 6 13
पायथन 2 में संलग्न क्षेत्र में मूल्य को संशोधित करने का कोई आसान तरीका नहीं है;
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
बचाव के लिए आता: आम तौर पर इस तरह के 1 की लंबाई के साथ एक सूची के रूप में एक परिवर्तनशील मूल्य, होने से नकली है
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.
किसी भी चर वर्तमान दायरे, या किसी भी संलग्न क्षेत्र के लिए स्थानीय माना जाता है, एक वैश्विक चर है। मॉड्यूल वैश्विक शब्दकोश में वैश्विक नाम देखा गया है; यदि नहीं मिला, तो ग्लोबल को बिल्टिन मॉड्यूल से देखा जाता है; मॉड्यूल का नाम पायथन 2 से पायथन 3 में बदल दिया गया था; पायथन 2 में यह __builtin__
था और पायथन 3 में इसे अब builtins
कहा जाता है। यदि आप बिल्टिन मॉड्यूल की विशेषता को असाइन करते हैं, तो इसके बाद किसी भी मॉड्यूल को पठनीय वैश्विक चर के रूप में दिखाई देगा, जब तक कि मॉड्यूल उन्हें उसी नाम से अपने वैश्विक चर के साथ छाया न करे।
बिल्टिन मॉड्यूल पढ़ना भी उपयोगी हो सकता है; मान लीजिए कि आप फ़ाइल के कुछ हिस्सों में पाइथन 3 स्टाइल प्रिंट फ़ंक्शन चाहते हैं, लेकिन फ़ाइल के अन्य भाग अभी भी print
कथन का उपयोग करते हैं, यदि आपका पायथन संस्करण> = 2 है।6, आप नई शैली समारोह प्राप्त कर सकते हैं के रूप में:
import __builtin__
print3 = __builtin__.__dict__['print']
from __future__ import print_function
वास्तव में print
समारोह आयात नहीं करता है अजगर 2 में कहीं भी - के बजाय यह सिर्फ, वर्तमान मॉड्यूल में print
बयान के लिए पार्स नियम को निष्क्रिय तरह print
से निपटने कोई अन्य परिवर्तनीय पहचानकर्ता, और इस प्रकार print
फ़ंक्शन को बिल्टिन में देखा जा सकता है।
लोग इस सवाल का थोड़ा "कर्म संपादन" कर कृपया रोक सकते हैं? –
वे सभी "कर्म संपादन" नहीं हैं। कुछ इसलिए हैं क्योंकि लोग समझ में नहीं आता कि चीजें कैसे काम करती हैं। देखें [** _ क्या प्रश्नों में उनके शीर्षक में "टैग" शामिल होना चाहिए? _ **] (https://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles)। – martineau