2012-06-03 18 views
6

Podczas korzystania z zmiennych globalnych napotkałem na dziwny problem w języku Python.Opis zmiennej globalnej w języku Python

Mam dwa moduły (pliki): mod1.py i mod2.py

mod1 próbuje zmodyfikować zmienną globalną var zdefiniowany w mod2. Ale var w mod2 i var w mod wydaje się być dwie różne rzeczy. Tak więc wynik pokazuje, że taka modyfikacja nie działa.

Oto kod:

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

Wszelkie wskazówkę o tym, dlaczego tak się dzieje? I jak mogę zmienić wartość val zdefiniowaną w mod2 w mod1?

Dzięki

Odpowiedz

11

podczas importowania var do mod1:

from mod2 import var,fun_of_mod2 

Dajesz mu nazwę varw przestrzeni nazw Mod1 użytkownika. To tak, jakby to zrobił:

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

Innymi słowy, istnieją obecnie dwie nazwy dla tej wartości, mod1.var i mod2.var. Na początku są one takie same, ale po ponownym przypisaniu mod1.var, mod2.var nadal wskazuje to samo.

Co chcesz zrobić, to po prostu:

import mod2 

Następnie dostępu i przypisać zmienną jako mod2.var.

Należy zauważyć, że zmienne globalne w Pythonie nie są prawdziwie globalne. Są one globalne tylko dla modułu, w którym zostały zadeklarowane. Aby uzyskać dostęp do zmiennych globalnych w innym module, należy użyć składni module.variable. Instrukcja global może być używana wewnątrz funkcji, aby umożliwić przypisanie nazwy globalnej modułu (bez niej przypisanie do zmiennej powoduje, że jest to lokalna zmienna w tej funkcji). Nie ma żadnego innego skutku.

+0

+1, ale aby w pełni odpowiedzieć na pytanie, należy wspomnieć o tym, co robi "globalny". Głównym problemem PO wydaje się być nieporozumienie tam, gdzie jest ono użyteczne. – lvc

+0

Dobra uwaga, dodałem kilka rzeczy na ten temat. – kindall

+0

Dzięki, myślę, że zrozumiałem. – xiaohan2012

Powiązane problemy