Comment fonctionnent les variables globales en Python? Je sais que les variables globales sont mauvaises, je fais juste des expériences.
Cela ne fonctionne pas en python:
G = None
def foo():
if G is None:
G = 1
foo()
Je reçois une erreur:
UnboundLocalError: local variable 'G' referenced before assignment
Qu'est-ce que je fais mal?
Vous avez besoin de l'instruction global
:
def foo():
global G
if G is None:
G = 1
En Python, les variables que vous affectez à deviennent des variables locales par défaut. Vous devez utiliser global
pour les déclarer en tant que variables globales. D'un autre côté, les variables auxquelles vous faites référence mais que vous n'affectez pas ne deviennent pas automatiquement des variables locales. Ces variables font référence à la variable la plus proche dans une étendue englobante.
Python 3.x introduit l'instruction nonlocal
qui est analogue à global
, mais lie la variable à sa portée englobante la plus proche. Par exemple:
def foo():
x = 5
def bar():
nonlocal x
x = x * 2
bar()
return x
Cette fonction renvoie 10 lorsqu'elle est appelée.
Vous devez déclarer G
comme global
, mais quant à la raison: chaque fois que vous faites référence à une variable à l'intérieur d'une fonction, si vous set la variable n'importe où dans cette fonction, Python suppose qu'il s'agit d'une variable locale. Donc, si une variable locale de ce nom n'existe pas à ce point du code, vous obtiendrez le UnboundLocalError
. Si vous en fait destiné à faire référence à une variable globale, comme dans votre question, vous avez besoin du mot clé global
pour dire Python c'est ce que vous vouliez dire.
Si vous n'affectez pas à la variable n'importe où dans la fonction, mais accédez uniquement à sa valeur, Python utilisera la variable globale par ce nom si elle existe. Vous pouvez donc faire:
G = None
def foo():
if G is None:
print G
foo()
Ce code affiche None
et ne renvoie pas l'UnboundLocalError.
Vous devez toujours déclarer G comme global, à partir de cette fonction:
G = None
def foo():
global G
if G is None:
G = 1
foo()
print G
qui sort simplement
1
Définissez G comme global dans la fonction comme ceci:
#!/usr/bin/python
G = None;
def foo():
global G
if G is None:
G = 1;
print G;
foo();
Ce qui précède python affiche 1
.
L'utilisation de variables globales comme celle-ci est une mauvaise pratique car: http://c2.com/cgi/wiki?GlobalVariablesAreBad