Je suis en train de comprendre ceci:portée Python
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!
Je suis en train de comprendre ceci:portée Python
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!
Au sein d'une fonction, les variables affectées sont traitées comme des variables locales par défaut. Pour affecter à des variables globales, utilisez l'instruction global
:
def g(n):
global c
c = c + n
Ceci est l'une des zones excentriques de Python qui n'a jamais vraiment bien avec moi sat.
L'état global est quelque chose à éviter, en particulier besoin de le muter. Considérez si g()
doit simplement prendre deux paramètres ou si f()
et g()
doivent être des méthodes d'une classe commune avec c
une instance d'attribut
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
autre que ce que dit Greg, en Python 3.0, il y aura l'instruction non locale pour indiquer "voici quelques noms qui sont définis dans la portée englobante". Contrairement à la globalité, ces noms doivent déjà être définis en dehors de la portée actuelle. Il sera facile de retrouver les noms et les variables. De nos jours vous ne pouvez pas être sûr où "quelque chose de globals" est exactement défini.
Errata pour Greg's post:
Il ne doit pas être avant qu'elles ne soient. Jetez un coup d'œil:
x = 1
def explode():
print x # raises UnboundLocalError here
x = 2
Il explose, même si x est affecté après sa référence. Dans Python, la variable peut être locale ou renvoyer la portée externe et ne peut pas changer dans une fonction.
Ceci est similaire à PHP, il nécessite également l'utilisation de 'global'. –