2012-12-14 40 views
13

वैश्विक विवरण क्या है? और इसका उपयोग कैसे किया जाता है? मैंने Python's official definition पढ़ा है;
हालांकि, यह मेरे लिए बहुत समझ में नहीं आता है।पायथन में वैश्विक बयान क्या है?

+3

सिर्फ एक टिप्पणी, 2.4 पाइथन का पुराना संस्करण है, [python 2.X संस्करण के लिए वास्तविक संदर्भ यहां है] (http://docs.python.org/2/reference/simple_stmts.html#global) –

+2

पाइथन 3 'ग्लोबल' के साथ नए स्टेटमेंट 'नॉनोकोकल' के साथ आता है, इसे भी देखें। –

+0

@ टाहाजहांगीर - यह एक अच्छा मुद्दा है। मैंने आपकी टिप्पणी के कारण अपने उत्तर में 'nonlocal' पर थोड़ा अस्पष्ट भी जोड़ा है। धन्यवाद! पूरी तरह से स्पष्टीकरण के लिए – mgilson

उत्तर

31

हर "चर" अजगर में एक निश्चित दायरे तक ही सीमित है देखें। एक पायथन "फ़ाइल" का दायरा मॉड्यूल-स्कोप है। पर विचार करें निम्नलिखित:

#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 में पेश किया गया था। nonlocalglobal का एक विस्तार है जो आपको एक वैरिएबल को संशोधित करने की अनुमति देता है जिसे आपने किसी भी दायरे से उठाया था जिसे इसे खींच लिया गया था।

+0

+1। हालांकि, आप प्रिंट स्टेटमेंट के परिणाम दिखाना चाह सकते हैं। –

+0

@StevenRumbalski - हो गया। अच्छा सुझाव। – mgilson

+0

अपना उत्तर पढ़ने के बाद इसे स्वयं जांचें और मेरी समझ ने इस विषय पर काफी सुधार किया है। आपका बहुत बहुत धन्यवाद! – Capurnicus

0

असल में यह दुभाषिया को बताता है कि इसके द्वारा दिए गए चर को डिफ़ॉल्ट स्थानीय स्तर की बजाय वैश्विक स्तर पर संशोधित या असाइन किया जाना चाहिए।

0
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 
0

आप प्रत्येक समारोह है कि संशोधित करता है यह

अजगर सुनिश्चित करें कि आप वास्तव में उस जानते हैं कि बनाना चाहता है में वैश्विक रूप में यह घोषणा करके अन्य कार्यों में एक वैश्विक चर का उपयोग कर सकते हैं क्या आप स्पष्ट रूप से की आवश्यकता के द्वारा के साथ खेल रहे हैं वैश्विक खोजशब्द

this answer

1

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 पढ़ने के लिए दृढ़ता से अनुशंसा करता हूं, भले ही अंत में एक टाइपो हो।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^