2009-05-13 11 views
44

In Python sto ottenendo il seguente errore:riferimento prima della errore di assegnazione in python

UnboundLocalError: local variable 'total' referenced before assignment 

All'inizio del file (prima che la funzione in cui l'errore viene), dichiaro 'totale' con il parola chiave globale. Quindi, nel corpo del programma, prima che venga chiamata la funzione che utilizza "total", la assegno a 0. Ho provato a impostarla su 0 in vari punti (compresa la parte superiore del file, subito dopo la sua dichiarazione), ma non riesco a farlo funzionare. Qualcuno vede cosa sto sbagliando?

+4

State dichiarando globale nella funzione? –

risposta

87

Penso che si stia utilizzando "globale" in modo errato. Vedi Python reference. Si dovrebbe dichiarare la variabile senza globale e quindi all'interno della funzione quando si desidera accedere alla variabile globale dichiarandola global yourvar.

#!/usr/bin/python 

total 

def checkTotal(): 
    global total 
    total = 0 

Guarda questo esempio:

#!/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() 

Perché doA() non modifica il globale totale l'uscita è 1 non 11.

+20

Potrebbe non valere la pena di avere solo la parola chiave "globale" se si assegna alla variabile globale all'interno di un ambito locale. Quindi, nel tuo esempio, la dichiarazione globale non è richiesta in checkTotal(). –

+1

Risposta completa e analisi approfondita dell'equivoco essenziale alla base della domanda. –

+1

Intendevo che valesse la pena * notando * ovviamente! Non è ancora possibile modificare i commenti senza delete-readd. :( –

1

mio scenario

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

Questa è una buona soluzione per decoratore. ! – notalentgeek

Problemi correlati