2015-10-02 2 views
1

main.py:Глобальные переменные между различными модулями

from module import * 
var=10 

def func2(): 
    print "func2:" ,var 

def main(): 
    global var 
    var=20 
    print "main - before", var 
    func2() 
    func1() 
    print "main - after", var 

if __name__=='__main__': 
    main() 

module.py

from main import * 

def func1(): 
    global var 
    print "func1:", var 

Программа печатает:

главный - до: 20

func2: 20

func1: 10

главное - после того, как 20

'вар' является глобальной переменной. Я ожидаю, что в тот момент, когда я изменю значение var, он будет изменен везде, где появится переменная var. Единственное различие между func1 и func2 заключается в том, что func1 находится в другом модуле. Тем не менее, я не понимаю, почему значение «var» отличается от func1 и func2.

+1

Если вы хотите глобальную переменную через модули HTTP: // stackoverflow.com/a/29702401/2141635 –

+0

Если ваша архитектура или программный дизайн требуют круговых зависимостей betwee n модулей, попробуйте переосмыслить его. –

ответ

1

В python нет действительно такой глобальной переменной. Объекты привязаны к переменным в пространствах имен, а ключевое слово global относится к текущему модулю namespace. from somemodule import * создает новые переменные в пространстве имен текущего модуля и ссылается на объекты somemodule. Теперь у вас есть две разные переменные, указывающие на один и тот же объект. Если вы перепроверьте одну из переменных, другие продолжают ссылаться на исходный объект. Кроме того, глобальное пространство имен functions.s является модулем, в котором он определен, даже если он импортирован в другой модуль.

Если вы хотите «глобальную» переменную, импортируйте модуль и используйте его квалифицированное имя для пространства имен вместо того, чтобы переустанавливать отдельные переменные в локальном пространстве имен.

Вот аннотированный пример ...

cfg.py

var = 10 
somelist = [] 
var2 = 1 

def show_var2(): 
    print var2 

main.py

import cfg 
from cfg import * # bind objects referenced by variables in cfg to 
        # like-named variables in this module. These objects 
        # from 'cfg' now have an additional reference here 

if __name__ == '__main__': 
    print cfg.var, var 
    var = 20  # rebind this module's 'var' to some other value. 
        # this does not affect cfg's 'var' 
    print cfg.var, var 

    print '----' 
    print cfg.somelist, somelist 
    somelist.append(1) # update this module's 'somelist' 
          # since we updated the existing object, all see it 
    print cfg.somelist, somelist 

    print '----' 
    var2 = 2 
    print var2, cfg.var2, show_var2() # show_var2 is in cfg.py and uses its 
             # namespace even if its been imported 
             # elsewhere 
+0

и что происходит, когда мы используем «import somemodule»? Правильно ли, что в этом случае мы НЕ создаем новую переменную, указывающую на тот же объект, поэтому мы просто используем ту же переменную, которая была создана в исходном модуле? – CrazySynthax

+0

@CrazySyntax - точно. Импорт создает новую ссылку на _somemodule_. Модули являются контейнерами для их глобальных переменных (внутри, пространство имен модулей - это _dict_), поэтому все, ссылающиеся на переменную через модуль, видят одну и ту же переменную. Если переменная переназначена ('somemodule.var =" новое значение "), весь код, ссылающийся на' somemodule.var', видит одну и ту же переменную и, следовательно, новое значение. – tdelaney