2009-05-13 10 views
44

में काम त्रुटि से पहले संदर्भित पायथन में मैं निम्न त्रुटि हो रही है:अजगर

UnboundLocalError: local variable 'total' referenced before assignment 

फ़ाइल के शुरू में (समारोह जहां त्रुटि से आता है से पहले), मैं 'कुल' का उपयोग कर की घोषणा वैश्विक खोजशब्द फिर, कार्यक्रम के शरीर में, 'कुल' का उपयोग करने वाले फ़ंक्शन से पहले, इसे 0 पर असाइन किया जाता है। मैंने इसे विभिन्न स्थानों पर 0 पर सेट करने का प्रयास किया है (फ़ाइल के शीर्ष सहित, इसे घोषित करने के बाद), लेकिन मैं इसे काम करने के लिए नहीं मिल सकता है। क्या कोई देखता है कि मैं क्या गलत कर रहा हूं?

+4

आप की घोषणा कर रहे हैं नहीं है समारोह में वैश्विक? –

उत्तर

87

मुझे लगता है कि आप गलत तरीके से 'वैश्विक' का उपयोग कर रहे हैं। Python reference देखें। जब आप ग्लोबल वैरिएबल तक पहुंचना चाहते हैं तो आपको ग्लोबल वैरिएबल तक पहुंचने के लिए वैरिएबल घोषित करना चाहिए और फिर फंक्शन के अंदर आपको global yourvar घोषित करना चाहिए।

#!/usr/bin/python 

total 

def checkTotal(): 
    global total 
    total = 0 

इस उदाहरण देखें:

#!/usr/bin/env python 

total = 0 

def doA(): 
    # not accessing global total 
    total = 10 

def doB(): 
    global total 
    total = total + 1 

def checkTotal(): 
    # global total - not required as global is required 
    # only for assignment - thanks for comment Greg 
    print total 

def main(): 
    doA() 
    doB() 
    checkTotal() 

if __name__ == '__main__': 
    main() 

क्योंकि doA() संशोधित नहीं करता वैश्विक कुल उत्पादन 1 11.

+20

यदि आप किसी स्थानीय दायरे में वैश्विक चर को असाइन करते हैं तो आपको केवल "वैश्विक" कीवर्ड की आवश्यकता नहीं है। तो आपके उदाहरण में, चेकटॉटल() में वैश्विक घोषणा की आवश्यकता नहीं है। –

+1

व्यापक उत्तर, और प्रश्न के पीछे आवश्यक गलतफहमी का एक अच्छी तरह से विश्लेषण। –

+1

मेरा मतलब था कि यह निश्चित रूप से * ध्यान देने योग्य * हो सकता है! अभी भी हटाए बिना टिप्पणियों को संपादित नहीं कर सकते हैं। :( –

1

मेरे परिदृश्य

def example(): 
    cl = [0, 1] 
    def inner(): 
     #cl = [1, 2] //access this way will throw `reference before assignment` 
     cl[0] = 1 
     cl[1] = 2 //these won't 

    inner() 
+0

यह सजावटी के लिए एक अच्छा समाधान है। धन्यवाद ! – notalentgeek