2009-08-15 19 views
26

पाइथन में वैश्विक चर कैसे काम करते हैं? मुझे पता है कि वैश्विक चर बुराई हैं, मैं बस प्रयोग कर रहा हूं।मैं पायथन में वैश्विक चर सेट क्यों नहीं कर सकता?

यह अजगर में काम नहीं करता:

UnboundLocalError: local variable 'G' referenced before assignment 

क्या मैं गलत कर रहा हूँ:

G = None 

def foo(): 
    if G is None: 
     G = 1 

foo() 

मैं कोई त्रुटि मिलती है?

def foo(): 
    global G 
    if G is None: 
     G = 1 

अजगर में, चर है कि आप डिफ़ॉल्ट रूप से बन स्थानीय चर के लिए असाइन:

उत्तर

56

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

पायथन 3.x nonlocal कथन प्रस्तुत करता है जो global के समान है, लेकिन चर को इसके निकटतम संलग्न क्षेत्र में बांधता है। उदाहरण के लिए:

def foo(): 
    x = 5 
    def bar(): 
     nonlocal x 
     x = x * 2 
    bar() 
    return x 

यह फ़ंक्शन 10 बार कॉल करता है।

+0

एस/चर/नाम/जी एस/आवंटित करने के लिए/करने के लिए बाध्य/जी –

+1

हाँ, एक अलग शब्दावली का उपयोग कर सकते हैं, लेकिन जब तक अजगर के रूप में ("चर" और "काम" त्रुटि संदेश में बारे में बात करती रूप में मूल प्रश्न में प्रकट होता है), मुझे लगता है कि समस्या की व्याख्या करते समय ऐसी शब्दावली पूरी तरह से स्वीकार्य है। –

+0

प्वाइंट लिया गया! भाषा संदर्भ हमेशा इस मामले पर हमेशा अनुरूप नहीं होता है। –

6

तुम अब भी वैश्विक रूप में घोषित करने के लिए जी, कि समारोह के भीतर से है:

G = None 

def foo(): 
    global G 
    if G is None: 
     G = 1 

foo() 
print G 

जो केवल आउटपुट

1 
2

समारोह में विश्व के रूप में परिभाषित जी इस तरह:

#!/usr/bin/python 

G = None; 
def foo(): 
    global G 
    if G is None: 
     G = 1; 
    print G; 

foo(); 

उपरोक्त पायथन 1 प्रिंट करता है।

इस तरह वैश्विक चर का उपयोग करना बुरा व्यवहार वजह से है: जब भी आप एक समारोह के अंदर एक चर का उल्लेख करता है, तो आप चर कहीं भी सेट: http://c2.com/cgi/wiki?GlobalVariablesAreBad

8

आप global रूप G घोषित करने के लिए की जरूरत है, लेकिन के लिए क्यों के रूप में उस समारोह में, पायथन मानते हैं कि यह एक स्थानीय चर है। इसलिए यदि उस नाम से स्थानीय चर कोड में उस बिंदु पर मौजूद नहीं है, तो आपको UnboundLocalError मिल जाएगा। यदि आप वास्तव में वैश्विक चर को संदर्भित करना चाहते हैं, जैसा कि आपके प्रश्न में है, तो आपको पाइथन को बताने के लिए global कीवर्ड की आवश्यकता है जो कि आपका मतलब है।

यदि आप फ़ंक्शन में कहीं भी चर को असाइन नहीं करते हैं, लेकिन केवल इसके मान तक पहुंचते हैं, तो पाइथन उस नाम से वैश्विक चर का उपयोग करेगा यदि कोई मौजूद है। तो अगर आप कर सकता है:

G = None 

def foo(): 
    if G is None: 
     print G 

foo() 

इस कोड को प्रिंट None और UnboundLocalError फेंक नहीं है।

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