2012-06-03 14 views
6

In Python stieß ich auf ein seltsames Problem, wenn ich globale Variablen verwende.Die globale Variable in Python verstehen

Ich habe zwei Module (Dateien): mod1.py und mod2.py

mod1 versucht in mod2 die globale Variable var definiert zu ändern. Aber die var in mod2 und var in mod scheint zwei verschiedene Dinge zu sein. Das Ergebnis zeigt also, dass eine solche Modifikation nicht funktioniert. Hier

ist der Code:

#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 :-(

Jeder Hinweis auf, warum dies geschieht? Und wie kann ich den Wert val ändern, der in mod2 in mod1 definiert ist?

Dank

Antwort

11

Wenn Sie var in mod1 importieren:

from mod2 import var,fun_of_mod2 

Sie geben ihm den Namen varin MOD1 Namespace. Es ist, als ob du das getan hast:

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

Mit anderen Worten, gibt es nun zwei Namen für den Wert, mod1.var und mod2.var. Sie sind zuerst gleich, aber wenn Sie mod1.var neu zuweisen, zeigt mod2.var immer noch auf die gleiche Sache.

Was möchten Sie ist zu tun, nur:

import mod2 

Dann zugreifen und die Variable als mod2.var zuweisen.

Es ist wichtig zu beachten, dass globale Variablen in Python nicht wirklich global sind. Sie sind nur für das Modul global, für das sie deklariert sind. Um auf globale Variablen in einem anderen Modul zuzugreifen, verwenden Sie die Syntax module.variable. Die global-Anweisung kann innerhalb einer Funktion verwendet werden, um die Zuweisung eines globalen Modulnamens zu ermöglichen (ohne sie zuzuweisen, wird eine lokale Variable in dieser Funktion definiert). Es hat keinen anderen Effekt.

+0

+1, aber um die Frage vollständig zu beantworten, sollten Sie erwähnen, was 'global' tut. Das Hauptproblem des OP scheint ein Missverständnis zu sein, wo es nützlich ist. – lvc

+0

guten Punkt, fügte einige Dinge dazu hinzu. – kindall

+0

Danke, ich glaube ich habe es verstanden. – xiaohan2012