2012-06-03 2 views
6

Я столкнулся с странной проблемой в Python при использовании глобальных переменных.Понимание глобальной переменной в Python

У меня есть два модуля (файлы): mod1.py и mod2.py

mod1 пытается изменить глобальную переменную var, определенный в mod2. Но var в mod2 и var в mod, кажется, две разные вещи. Таким образом, результат показывает, что такая модификация не работает.

Вот код:

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

Любой намек на то, почему это происходит? И как я могу изменить значение val, определенное в mod2 в mod1?

Благодаря

ответ

11

При импорте var в mod1:

from mod2 import var,fun_of_mod2 

Вы даете ему имя varв пространстве имен Mod1 в. Это как если бы вы сделали это:

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

Другими словами, в настоящее время существует два названия для значения, mod1.var и mod2.var. Сначала они совпадают, но когда вы переназначаете mod1.var, mod2.var все еще указывает на то же самое.

То, что вы хотите сделать, это просто:

import mod2 

Затем доступ и назначить переменную mod2.var.

Важно отметить, что глобальные переменные в Python не являются поистине глобальными. Они являются глобальными только для модуля, в котором они объявлены. Чтобы получить доступ к глобальным переменным внутри другого модуля, вы используете синтаксис module.variable. Оператор global может использоваться внутри функции, позволяющей назначать глобально-глобальное имя (без этого, присвоение переменной делает ее локальной переменной в этой функции). Это не имеет никакого другого эффекта.

+0

+1, но для полного ответа на вопрос вы должны упомянуть, что делает 'global'. Основная проблема OP, по-видимому, является непониманием, когда она полезна. – lvc

+0

хорошая точка, добавил некоторые вещи об этом. – kindall

+0

Спасибо, думаю, я понял. – xiaohan2012

Смежные вопросы