2012-01-23 7 views
0
gCharlie = 0 
gJeff = 0 

def Bob(): 
    Charlie = gCharlie 
    Jeff = gJeff 
    Number = int(input("Hello and Welcome to Charlie's Number Guessing Game. Enter a nonnegative number from 0 to 10 not counting 0. ")) 

Ce code me donne cette erreur en Python 3.2:Python 3.2.2 Erreur variable locale

UnboundLocalError: local variable 'gCharlie' referenced before assignment 

Qu'est-ce que cette erreur variable locale signifie?

+4

J'ai couru ce code moi-même et n'ai pas eu de telles erreurs. Peut-être fournir le code qui appelle cette fonction? Est-ce dans un fichier séparé? Comment l'importez-vous si c'est le cas? etc –

+3

J'ai essayé ce qui précède dans deux versions différentes de Python et il a parfaitement fonctionné. – senderle

Répondre

3

Dans l'étendue de votre fonction, vous devez avoir réaffecté gJeff et gCharlie, qui les ont créés comme de nouvelles variables locales. Pour dire à Python que vous utilisez les globals, changez le début de votre fonction pour qu'elle ressemble à ceci.

def Bob(): 
    global gCharlie 
    global gJeff 
    Charlie=gCharlie 

sans dire python que vous utilisez globals, il essaie de référencer gCharlie locale et les variables gJeff, qui, comme il dit, ne sont pas affectés à ce point dans votre fonction. La raison pour laquelle les gens le font fonctionner, c'est parce qu'ils n'utilisent que le code que vous avez posté. Vous pouvez référencer les globales sans les dire explicitement SEULEMENT si vous ne changez pas leurs valeurs dans la fonction en les référençant.

En règle générale, python recherche dans cet ordre un nom de variable: portée locale, n'importe quel def il est imbriqué, global, built ins. Parce que gJeff et gCharlie sont des variables locales dans votre fonction, elles s'arrêtent là, à moins que vous ne le disiez autrement.

Si vous souhaitez voir en action essayer de regarder ce

x=5 

def useX(): 
    x=0  #this is a local variable 
    print "in function: ", x 

def main(): 
    print "in main(1): ", x 
    useX() 
    print "in main(2): ", x 

main() 

cette volonté sortie

in main(1): 5 
in function: 0 
in main(2): 5 

parce que dans la fonction, x est créé comme une nouvelle variable locale. Ajouter une instruction x globale à la fonction useX changerait la dernière ligne pour imprimer "0" au lieu de "5"

+1

* "il ne reconnaît pas les globals par défaut." * Est trompeur, par exemple, chaque nom de module que vous introduisez via 'import some_module' au niveau du module est un global ordinaire que vous pouvez évidemment * utiliser * dans n'importe quelle fonction. Vous n'avez pas besoin de 'global' si vous ne changez pas leurs liaisons dans la fonction, [exemple] (http://ideone.com/J2s6K). Si vous en avez besoin, vous devriez probablement refactoriser la fonction en une méthode et le global en un attribut d'instance. – jfs

+0

Un exemple encore plus évident est le nom des fonctions. Vous n'avez pas besoin de 'global useX' pour appeler' useX() 'dans' main() '. – jfs

+0

Cette réponse est incorrecte. –

2

Cela peut être dû à gCharlie = dans une fonction (note: la première lettre est g).

Utiliser les paramètres au lieu de: GLOBALS

def bob(charlie=0, jeff=0): 
    number = int(input("...")) 
    # ... 

bob(charlie=3) 
2

Cela signifie que vous assignant à gCharlie dans la partie de la fonction que vous ne présentez pas, et si le compilateur Python a marqué comme une variable locale . En tant que tel, vous y accédez avant qu'il n'existe. Utilisez nonlocal ou global pour résoudre.

1

Deux réponses précédentes sont correctes, mais les deux sont un peu floues. Je vais vous montrer quelques exemples:

Le code fonctionnera bien montrer:

>>> gCharlie = "Global!" 
>>> 
>>> def foo(): 
...  print(gCharlie) 
... 
>>> foo() 
Global! 
>>> print(gCharlie) 
Global! 

Donc ce n'est pas le problème du tout. Cependant, vous ne pouvez pas affecter variables globales dans une fonction:

>>> gCharlie = "Global!" 
>>> def foo(): 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Local! 
>>> print(gCharlie) 
Global! 

Comme vous le voyez, la gCharlie variable globale n'a pas changé. C'est parce que vous ne l'avez pas modifié, vous avez créé une nouvelle variable locale, avec le même nom. Et c'est la cause de l'erreur:

>>> gCharlie = "Global!" 
>>> def foo(): 
...  oldCharlie = gCharlie 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
UnboundLocalError: local variable 'gCharlie' referenced before assignment 

L'indice est dans l'erreur.Il est dit local variable gCharlie. Le problème n'est pas l'impossibilité d'accéder au global gCharlie, mais le local n'a pas encore été créé. Le correctif consiste à spécifier que vous ne voulez pas créer une variable locale, mais que vous voulez modifier la variable globale. Vous faites cela avec le mot-clé global.

>>> gCharlie = "Global!" 
>>> def foo(): 
...  global gCharlie 
...  oldCharlie = gCharlie 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Local! 
>>> print(gCharlie) 
Local! 

Comme vous le voyez maintenant, vous avez modifié la variable globale. Cela dit, les variables globales sont généralement une mauvaise idée. Évite-les. Essayez de transmettre les variables en tant que paramètres à la place.

Questions connexes