2009-05-13 6 views
44

En Python, je reçois l'erreur suivante:référencé avant erreur d'affectation en python

UnboundLocalError: local variable 'total' referenced before assignment 

Je déclare Au début du fichier (avant que la fonction où l'erreur provient de), « total » à l'aide du mot-clé global. Ensuite, dans le corps du programme, avant d'appeler la fonction qui utilise 'total', je l'attribue à 0. J'ai essayé de le mettre à 0 à divers endroits (y compris le haut du fichier, juste après sa déclaration), mais je ne peux pas le faire fonctionner. Est-ce que quelqu'un voit ce que je fais mal?

+4

declares vous global dans la fonction? –

Répondre

87

Je pense que vous utilisez incorrectement 'global'. Voir Python reference. Vous devez déclarer variable sans global et ensuite dans la fonction lorsque vous voulez accéder à la variable globale, vous le déclarez global yourvar.

#!/usr/bin/python 

total 

def checkTotal(): 
    global total 
    total = 0 

Voir cet exemple:

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

Parce que doA() ne modifie pas le total global la sortie est de 1 pas 11.

+20

Cela ne vaut peut-être rien que vous ayez seulement besoin du mot-clé "global" si vous affectez à la variable globale dans une portée locale. Donc, dans votre exemple, la déclaration globale n'est pas requise dans checkTotal(). –

+1

Réponse complète, et une analyse soignée de l'incompréhension essentielle derrière la question. –

+1

Je voulais dire que ça valait la peine de le noter * bien sûr! Vous ne pouvez toujours pas modifier les commentaires sans delete-readd. :( –

1

Mon scénario

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

Ceci est une bonne solution pour décorateur. ! – notalentgeek

Questions connexes