Python 3: Nonboundlocalerror: variable locale référencée avant l'assignation [dupliquer]

cette question a déjà une réponse ici:

  • Python de la portée des variables d'erreur 10 réponses

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 réparer ça? Merci pour toute aide!

100
demandé sur orokusaki 2012-06-01 18:13:28

5 réponses

vous pouvez corriger cela en passant des paramètres plutôt que de compter sur des 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)
31
répondu Jakob Bowyer 2012-06-01 14:15:32

c'est parce que, bien que Var1 existe, vous utilisez également une instruction d'affectation sur le nom Var1 à l'intérieur de la fonction ( Var1 -= 1 à la ligne de fond). Naturellement, cela crée une variable à l'intérieur du champ d'application de la fonction appelée Var1 (honnêtement, une -= ou += ne mettra à jour (réassigner) qu'une variable existante, mais pour des raisons inconnues (cohérence probable dans ce contexte), Python la traite comme une affectation). L'interpréteur Python voit ceci au moment de la charge du module et décide (correctement) que le Var1 du global scope ne doit pas être utilisé à l'intérieur du local scope, ce qui entraîne un problème lorsque vous essayez de faire référence à la variable avant qu'elle ne soit assignée localement.

utiliser des variables globales, en dehors de la nécessité, est généralement mal vu par les développeurs Python, parce qu'il conduit à du code confus et problématique. Cependant, si vous souhaitez les utiliser pour accomplir ce que votre code est impliquant, vous pouvez simplement ajouter:

global Var1, Var2

dans le haut de votre fonction. Cela indiquera à Python que vous n'avez pas l'intention de définir une variable Var1 ou Var2 dans la portée locale de la fonction. L'interpréteur Python voit cela au moment du chargement du module et décide (correctement) de rechercher toute référence aux variables mentionnées ci-dessus dans le champ d'Application global.

Certaines Ressources

248
répondu orokusaki 2018-01-23 00:58:41

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 ensemble, donc 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()
48
répondu madjar 2012-06-01 14:19:54

Je n'aime pas ce comportement, mais C'est comme ça que Python fonctionne. La question a déjà été répondue par d'autres, mais pour être complet, permettez-moi de souligner que Python 2 a plus de ces bizarreries.

def f(x):
    return x

def main():
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

Python 2.7.6 renvoie une erreur:

Traceback (most recent call last):
  File "weird.py", line 9, in <module>
    main()
  File "weird.py", line 5, in main
    print f(3)
UnboundLocalError: local variable 'f' referenced before assignment

Python voit la f comme une variable locale dans [f for f in [1, 2, 3]] , et décide qu'elle est aussi une variable locale dans f(3) . Vous pouvez ajouter une déclaration global f :

def f(x):
    return x

def main():
    global f
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

cela fonctionne; cependant, F devient 3 à la fin... C'est-à-dire, print [f for f in [1, 2, 3]] change maintenant la variable globale f en 3 , de sorte qu'elle n'est plus une fonction.

heureusement, cela fonctionne très bien en Python3 après avoir ajouté les parenthèses à print .

8
répondu osa 2014-10-27 01:10:52

pourquoi ne pas simplement retourner votre valeur calculée et laisser l'appelant modifier la variable globale. Ce n'est pas une bonne idée pour manipuler une variable globale dans 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 retourner les résultats que l'appelant peut alors assigner de manière appropriée

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

Var1 = function()
1
répondu ctx 2014-11-20 11:06:22