Si vous lisez une variable, Python la recherche dans toute la chaîne de portée. Cela signifie que:
GLOB_VAR = "Some string"
def some_fun():
print GLOB_VAR
imprimera Some string
Maintenant, si vous écrivez à une variable, Python cherche dans le champ d'application locale, et si elle ne peut pas trouver une variable avec le nom que vous avez donné au niveau local, alors il en crée un.
Cela signifie que dans votre exemple, vous avez créé une variable nommée SOME_VARIABLE
locale à votre fonction some_fun
, au lieu de mettre à jour la SOME_VARIABLE
mondiale. C'est un gotcha classique en python.
Si vous voulez écrire dans votre global, vous devez indiquer explicitement à Python que vous parlez d'une variable globale qui existe déjà. Pour ce faire, vous devez utiliser le mot clé global
. Ainsi, les éléments suivants:
GLOB_VAR = "Some string"
def some_fun():
global GLOB_VAR
GLOB_VAR = "Some other string"
some_fun()
print GLOB_VAR
imprimera Some other string
.
Note: Je le vois comme un moyen d'encourager les gens à garder les variables globales en lecture seule, ou du moins à penser à ce qu'ils font.
Le comportement est le même (juste un peu plus surprenant) lorsque vous essayez de lire d'abord, puis écrire dans un global. Ce qui suit:
GLOB_VAR = False
def some_fun():
if GLOB_VAR:
GLOB_VAR = False
some_fun()
soulèvera:
Traceback (most recent call last):
File "t.py", line 7, in <module>
some_fun()
File "t.py", line 4, in some_fun
if GLOB_VAR:
UnboundLocalError: local variable 'GLOB_VAR' referenced before assignment
parce que depuis que nous modifierons GLOB_VAR
, il est considéré comme une variable locale.
Mise à jour: Ely Bendersky a une in-depth post liée à ce sujet qui mérite une lecture pour plus de détails plus formels.