2010-09-07 12 views

Répondre

7

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.

0

SOME_VARIABLE est global, donc la reliure ne sera effective que si vous utilisez global. Mais puisque c'est un objet mutable, il suffit de le faire muter correctement.

del SOME_VARIABLE[:] 
5

Vous devez dire à l'interprète que vous parlez d'une variable globale:

def some_fun: 
    global SOME_VARIABLE 
    ... 
    SOME_VARIABLE = [] 
2

si vous ne vous pourriez pas besoin plus le une_variable utiliser:

del SOME_VARIABLE 

si vous voulez une liste vide:

del SOME_VARIABLE[:] 
Questions connexes