2012-06-03 17 views
6

Mi sono imbattuto in uno strano problema in Python quando si utilizzavano variabili globali.Informazioni sulla variabile globale in Python

ho due moduli (file): mod1.py e mod2.py

mod1 tenta di modificare la variabile globale var definito mod2. Ma lo var in mod2 e var in mod sembra essere due cose diverse. Pertanto, il risultato mostra che tale modifica non funziona.

Ecco il codice:

#code for mod2.py 
global var 
var = 1 
def fun_of_mod2(): 
    print var 

#code for mod1.py 
from mod2 import var,fun_of_mod2  
global var #commenting out this line yields the same result 
var = 2 #I want to modify the value of var defined in mod2 
fun_of_mod2() #but it prints: 1 instead of 2. Modification failed :-(

Qualsiasi suggerimento su perché questo accade? E come posso modificare il valore di val definito in mod2 in mod1?

Grazie

risposta

11

quando si importano var in mod1:

from mod2 import var,fun_of_mod2 

si stanno dando il nome varnel namespace di mod1. È come se avete fatto queste cose:

import mod2 
var = mod2.var 
fun_of_mod2 = mod2.fun_of_mod2 
del mod2 

In altre parole, ora ci sono due nomi per il valore, mod1.var e mod2.var. Inizialmente sono uguali, ma quando riassegni lo mod1.var, lo mod2.var punta ancora alla stessa cosa.

Che cosa si vuole fare è solo:

import mod2 

quindi accedere e assegnare la variabile come mod2.var.

È importante notare che le variabili globali in Python non sono veramente globali. Sono globali solo per il modulo in cui sono dichiarati. Per accedere a variabili globali all'interno di un altro modulo, si utilizza la sintassi module.variable. L'istruzione global può essere utilizzata all'interno di una funzione per consentire a un nome globale del modulo di essere assegnato (senza di esso, l'assegnazione a una variabile lo rende una variabile locale in quella funzione). Non ha altri effetti.

+0

+1, ma per rispondere completamente alla domanda è necessario menzionare cosa fa "globale". Il problema principale dell'OP sembra essere l'incomprensione in cui è utile. – lvc

+0

buon punto, aggiunto alcune cose al riguardo. – kindall

+0

Grazie, penso di aver capito. – xiaohan2012