2014-09-04 3 views
0

У меня есть эти 4 модуля globals.pyИспользование глобальных переменных в Python модулей

globvara = "a" 

mod1.py

from globals import * 

print globvara 

выход: а

mod2.py

from mod1 import * 

def changegv(newval1): 
    #global globvara 
    globvara = newval1 

def usechangegv(newval2): 
    changegv(newval2) 

и mod3.py

from mod2 import * 

usechangegv("b") 

print globvara 

выход:

Я задаюсь вопросом, почему globalvar не меняется в модуле 2. Я что-то в глобальных переменных отсутствует. Даже если я раскомментирую глобальную строку globvara, я получаю тот же результат. Где ошибка?

+0

Из интереса , вы делаете это как эксперимент, чтобы ознакомиться с тем, как работает область действия на Python или у вас есть такой случай в программе, которую вы используете? iting? – s16h

+0

Я работаю над большим проектом, и я упростил его. – Yannis

+0

Связанный: http://stackoverflow.com/questions/25630386/how-to-use-a-dictionary-loaded-from-one-module-into-the-main-program-from-anothe (но не diff, Думаю, и потому, что этот вопрос хочет иметь возможность _assign_ в 'globvara' в каждом модуле, а не просто обращаться к нему, и потому что он не спрашивает, как« обойти »эту проблему, просто спрашивая, что происходит). – abarnert

ответ

5

Глобальные переменные Python являются глобальными только для модулей. Когда вы импортируете переменную из другого модуля (например, from mod1 import *), Python создает duplicate ссылки на значение в модуле импорта. Итак, теперь у вас есть два имени: mod1.globvara и mod2.globvara, которые изначально указывают на одно и то же значение, но которые никоим образом не связаны. Если вы измените globvara в mod2.py, вы меняете mod2.globvara и mod1.globvaraне влияет.

Чтобы избежать этой проблемы, импортируйте модуль, а не отдельные имена, определенные в нем. Например, import globals. Затем всегда обращайтесь к globals.globvara (или еще лучше, globals.a). Поскольку вы всегда получаете доступ и назначаете одно и то же имя, он будет работать так, как вы ожидаете.

+0

Итак, как я могу получить глобальную переменную во многих модулях? – Yannis

+0

Как я уже объяснил, вы не можете; не так, как вы хотите. – kindall

+0

ОК. Благодарю. Я проверю его. – Yannis

1

Не используйте

from <module> import <variable> 

Как он создает копию переменной.

ли простой:

import <module> 

И все обращения к глобальной переменной следует использовать "переменную" в "модуле":

<module>.<variable> = ... 

или

print <module>.<variable> 
Смежные вопросы