41 votes

Portée python

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!

52voto

Greg Hewgill Points 356191

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

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

C’est l’une des zones bizarres de Python qui ne m’a jamais vraiment si bien accueilli.

12voto

ironfroggy Points 3496

L’état global est quelque chose à éviter, en particulier le besoin de le muter. Considérez si g() devrait simplement prendre deux paramètres ou si f() et g() doivent être des méthodes d'une classe commune avec 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)
 

Les sorties:

 2
3
 

9voto

Krzysiek Goj Points 1049

Errata pour le post de Greg :

Il devrait y avoir aucun avant qu'ils soient référencés . Jetez un coup d'oeil:


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.

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