306 votes

Python 3 : UnboundLocalError : variable locale référencée avant affectation

Le code suivant donne l'erreur UnboundLocalError: local variable 'Var1' referenced before assignment :

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

Comment puis-je arranger ça ?

137voto

madjar Points 4687

Si vous définissez la valeur d'une variable à l'intérieur de la fonction, python la comprend comme la création d'une variable locale avec ce nom. Cette variable locale masque la variable globale.

Dans votre cas, Var1 est considéré comme une variable locale, et il est utilisé avant d'être défini, d'où l'erreur.

Pour résoudre ce problème, vous pouvez explicitement dire que c'est un global en mettant global Var1 dans votre fonction.

Var1 = 1
Var2 = 0
def function():
    global Var1
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

100voto

Jakob Bowyer Points 12873

Vous pouvez corriger cela en passant des paramètres plutôt que de vous appuyer sur Globals

def function(Var1, Var2): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    return Var1 - 1
function(1, 1)

5voto

ctx Points 79

Pourquoi ne pas simplement renvoyer votre valeur calculée et laisser l'appelant modifier la variable globale. Ce n'est pas une bonne idée de manipuler une variable globale au sein d'une fonction, comme ci-dessous :

Var1 = 1
Var2 = 0

def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    return Var1 - 1

Var1 = function()

ou même faire des copies locales des variables globales et travailler avec elles et renvoyer les résultats que l'appelant peut ensuite attribuer de manière appropriée

def function():
v1, v2 = Var1, Var2
# calculate using the local variables v1 & v2
return v1 - 1

Var1 = function()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X