Question

    

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

         

J'essaie de comprendre ceci:

c = 1
def f(n):
    print c + n 
def g(n):
    c = c + n

f(1) => 2
g(1) => UnboundLocalError: local variable 'c' referenced before assignment

Merci!

Était-ce utile?

La solution

Dans une fonction, les variables affectées sont traitées par défaut comme des variables locales. Pour affecter des variables globales, utilisez le global déclaration:

def g(n):
    global c
    c = c + n

C’est l’une des zones bizarres de Python qui ne m’a jamais si bien plu que moi.

Autres conseils

L’état global est quelque chose à éviter, en particulier le besoin de le muter. Déterminez si g () doit simplement prendre deux paramètres ou si f () et g () doivent être des méthodes d'une classe commune avec < code> c un attribut d'instance

class A:
    c = 1
    def f(self, n):
        print self.c + n
    def g(self, n):
        self.c += n

a = A()
a.f(1)
a.g(1)
a.f(1)

Sorties:

2
3

Errata pour le message de Greg :

Il ne devrait y avoir aucun avant qu'ils soient référencés . Regarde:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

Il explose, même si x est attribué après sa référence. En Python, la variable peut être locale ou faire référence à une portée externe, et elle ne peut pas changer dans une fonction.

Hormis ce que Greg a dit, dans Python 3.0, il y aura une déclaration non locale à indiquer "voici quelques noms définis dans la portée englobante". Contrairement à Global, ces noms doivent déjà être définis en dehors de la portée actuelle. Il sera facile de rechercher des noms et des variables. De nos jours, vous ne pouvez pas savoir exactement où & globals quelque chose " est exactement défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top