2008-09-28 14 views
38

मैं इस यह पता लगाने की कोशिश कर रहा हूँ:अजगर गुंजाइश

c = 1 
def f(n): 
    print c + n 
def g(n): 
    c = c + n 

f(1) => 2 
g(1) => UnboundLocalError: local variable 'c' referenced before assignment 

धन्यवाद!

उत्तर

51

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

def g(n): 
    global c 
    c = c + n 

यह है कि गया है वास्तव में कभी नहीं मेरे साथ अच्छी तरह से बैठ गया अजगर की विचित्र क्षेत्रों में से एक है।

+0

यह PHP के समान है, इसे 'वैश्विक' के उपयोग की भी आवश्यकता है। –

11

वैश्विक स्थिति कुछ बचने के लिए है, विशेष रूप से इसे बदलने की आवश्यकता है। पर विचार करें, तो g() बस दो पैरामीटर लेना चाहिए या यदि f() और g()c एक उदाहरण के साथ एक आम वर्ग के तरीकों की जरूरत है विशेषता

class A: 
    c = 1 
    def f(self, n): 
     print self.c + n 
    def g(self, n): 
     self.c += n 

a = A() 
a.f(1) 
a.g(1) 
a.f(1) 

आउटपुट:

2 
3 
2

से क्या ग्रेग ने कहा अन्य, पायथन में 3.0, राज्य के लिए गैरकानूनी बयान होगा "यहां कुछ नाम हैं जो संलग्न क्षेत्र में परिभाषित हैं"। वैश्विक के विपरीत उन नामों को पहले से ही मौजूदा दायरे से बाहर परिभाषित किया जाना चाहिए। नाम और चर को ट्रैक करना आसान होगा। आजकल आप यह सुनिश्चित नहीं कर सकते कि "ग्लोबल्स कुछ" कहां परिभाषित किया गया है।

9

Greg's post के लिए Errata:

कोई होनी चाहिए इससे पहले कि वे दर्शाया जाता है। एक नज़र डालें:

 
x = 1 
def explode(): 
    print x # raises UnboundLocalError here 
    x = 2 

यह विस्फोट हो जाता है, भले ही x को इसके संदर्भ के बाद असाइन किया गया हो। पायथन वैरिएबल में स्थानीय हो सकता है या बाहरी दायरे को संदर्भित किया जा सकता है, और यह एक फ़ंक्शन में नहीं बदला जा सकता है।

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