105 votes

Pourquoi ai-je une erreur "referenced before assignment" lors de l'assignation à une variable globale dans une fonction ?

En Python, j'obtiens l'erreur suivante :

UnboundLocalError: local variable 'total' referenced before assignment

Au début du fichier (avant la fonction d'où provient l'erreur), je déclare total en utilisant le mot-clé global. Ensuite, dans le corps du programme, avant que la fonction qui utilise total soit appelée, je lui attribue la valeur 0. J'ai essayé de le mettre à 0 à différents endroits (y compris au début du fichier, juste après sa déclaration), mais je n'arrive pas à le faire fonctionner.

Est-ce que quelqu'un voit ce que je fais de travers ?

203voto

stefanB Points 27796

Je pense que vous utilisez 'global' incorrectement. Voir la référence Python. Vous devriez déclarer la variable sans global, puis à l'intérieur de la fonction lorsque vous voulez accéder à la variable globale, vous la 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():
    # n'accède pas à total global
    total = 10

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

def checkTotal():
    # total global - non requis car global est requis
    # seulement pour l'affectation - merci pour le commentaire Greg
    print total

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

if __name__ == '__main__':
    main()

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

7voto

zinking Points 1253

Mon scénario

def exemple():
    cl = [0, 1]
    def interne():
        #cl = [1, 2] # accéder de cette manière provoquera une `référence avant assignation`
        cl[0] = 1 
        cl[1] = 2   # ceux-ci ne le feront pas

    interne()

1voto

zest Points 2098

Je veux mentionner que vous pouvez faire comme ceci pour la portée de la fonction

def main()

  self.x = 0

  def increment():
    self.x += 1

  for i in range(5):
     increment()

  print(self.x)

-3voto

ninja Points 1
def inside():
   global var
   var = 'info'
inside()
print(var)

>>>'info'

problème terminé

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