वैश्विक विवरण क्या है? और इसका उपयोग कैसे किया जाता है? मैंने Python's official definition पढ़ा है;
हालांकि, यह मेरे लिए बहुत समझ में नहीं आता है।पायथन में वैश्विक बयान क्या है?
उत्तर
हर "चर" अजगर में एक निश्चित दायरे तक ही सीमित है देखें। एक पायथन "फ़ाइल" का दायरा मॉड्यूल-स्कोप है। पर विचार करें निम्नलिखित:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
स्थानीय गुंजाइश के साथ वस्तुओं समारोह रास्ते के रूप में जैसे ही मर जाते हैं और पुनः प्राप्त कभी नहीं किया जा सकता है (जब तक आप return
उन्हें), लेकिन एक समारोह के भीतर, आप चर मॉड्यूल स्तर दायरे में उपयोग कर सकते हैं (या किसी भी युक्त गुंजाइश):
myvariable = 5
def func():
print(myvariable) # prints 5
def func2():
x = 3
def func3():
print(x) # will print 3 because it picks it up from `func2`'s scope
func3()
हालांकि, आपको संदर्भ पर काम उपयोग नहीं कर सकते और उम्मीद करते हैं कि यह एक बाहरी गुंजाइश के लिए प्रचारित किया जाएगा:
myvariable = 5
def func():
myvariable = 6 # creates a new "local" variable.
# Doesn't affect the global version
print(myvariable) # prints 6
func()
print(myvariable) # prints 5
अब, हम अंततः global
पर हैं। global
कीवर्ड वह तरीका है जिसे आप पाइथन कहते हैं कि आपके फ़ंक्शन में एक विशेष चर वैश्विक (मॉड्यूल-स्तर) दायरे में परिभाषित किया गया है।
myvariable = 5
def func():
global myvariable
myvariable = 6 # changes `myvariable` at the global scope
print(myvariable) # prints 6
func()
print(myvariable) # prints 6 now because we were able
# to modify the reference in the function
दूसरे शब्दों में, आप func
के भीतर से मॉड्यूल-दायरे में myvariable
का मूल्य बदल अगर आप global
कीवर्ड का उपयोग कर सकते हैं।
एक अलग रूप में के रूप में, स्कोप मनमाने ढंग से गहरी नेस्ट जा सकता है:
def func1():
x = 3
def func2():
print("x=",x,"func2")
y = 4
def func3():
nonlocal x # try it with nonlocal commented out as well. See the difference.
print("x=",x,"func3")
print("y=",y,"func3")
z = 5
print("z=",z,"func3")
x = 10
func3()
func2()
print("x=",x,"func1")
func1()
अब इस मामले में, चर में से कोई भी वैश्विक क्षेत्र पर घोषित कर दिया जाता है, और को Python2 में, कोई (आसान/साफ) के दायरे में के दायरे में x
के मान को बदलने का तरीका। यही कारण है कि nonlocal
कीवर्ड python3.x में पेश किया गया था। nonlocal
global
का एक विस्तार है जो आपको एक वैरिएबल को संशोधित करने की अनुमति देता है जिसे आपने किसी भी दायरे से उठाया था जिसे इसे खींच लिया गया था।
+1। हालांकि, आप प्रिंट स्टेटमेंट के परिणाम दिखाना चाह सकते हैं। –
@StevenRumbalski - हो गया। अच्छा सुझाव। – mgilson
अपना उत्तर पढ़ने के बाद इसे स्वयं जांचें और मेरी समझ ने इस विषय पर काफी सुधार किया है। आपका बहुत बहुत धन्यवाद! – Capurnicus
असल में यह दुभाषिया को बताता है कि इसके द्वारा दिए गए चर को डिफ़ॉल्ट स्थानीय स्तर की बजाय वैश्विक स्तर पर संशोधित या असाइन किया जाना चाहिए।
a = 1
def f():
a = 2 # doesn't affect global a, this new definition hides it in local scope
a = 1
def f():
global a
a = 2 # affects global a
आप प्रत्येक समारोह है कि संशोधित करता है यह
अजगर सुनिश्चित करें कि आप वास्तव में उस जानते हैं कि बनाना चाहता है में वैश्विक रूप में यह घोषणा करके अन्य कार्यों में एक वैश्विक चर का उपयोग कर सकते हैं क्या आप स्पष्ट रूप से की आवश्यकता के द्वारा के साथ खेल रहे हैं वैश्विक खोजशब्द
mgilson ने अच्छा काम किया लेकिन मैं कुछ और जोड़ना चाहता हूं।
list1 = [1]
list2 = [1]
def main():
list1.append(3)
#list1 = [9]
list2 = [222]
print list1, list2
print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2
>>> [1, 3] [1]
एक समारोह के अंदर, अजगर जब तक आप वैश्विक रूप में यह घोषणा स्थानीय चर के रूप में हर चर मान लिया गया है, या आप एक वैश्विक चर तक पहुँच रहे हैं।
list1.append(2)
संभव था क्योंकि आप 'सूची 1' तक पहुंच रहे हैं और सूचियां उत्परिवर्तनीय हैं।
list2 = [222]
संभव था क्योंकि आप स्थानीय चर प्रारंभ कर रहे हैं।
लेकिन यदि आप टिप्पणी हटाएं # List1 इसका मतलब है = [9], आप
UnboundLocalError: local variable 'list1' referenced before assignment
मिल जाएगा कि आप एक नया स्थानीय चर 'List1' प्रारंभ करने की कोशिश कर रहे हैं, लेकिन यह पहले से ही से पहले संदर्भित किया गया था, और आप कर रहे हैं इसे फिर से सौंपने के दायरे से बाहर।
दायरे में प्रवेश करने के लिए, वैश्विक रूप में 'list1' घोषित करें।
मैं आपको this पढ़ने के लिए दृढ़ता से अनुशंसा करता हूं, भले ही अंत में एक टाइपो हो।
सिर्फ एक टिप्पणी, 2.4 पाइथन का पुराना संस्करण है, [python 2.X संस्करण के लिए वास्तविक संदर्भ यहां है] (http://docs.python.org/2/reference/simple_stmts.html#global) –
पाइथन 3 'ग्लोबल' के साथ नए स्टेटमेंट 'नॉनोकोकल' के साथ आता है, इसे भी देखें। –
@ टाहाजहांगीर - यह एक अच्छा मुद्दा है। मैंने आपकी टिप्पणी के कारण अपने उत्तर में 'nonlocal' पर थोड़ा अस्पष्ट भी जोड़ा है। धन्यवाद! पूरी तरह से स्पष्टीकरण के लिए – mgilson