python的全局变量如何在模块之间共享?

python的全局变量如何在模块之间共享?

一个简单的实验:

假设现在有两个模块,模块varmain.py负责声明并初始化全局变量,同时作为main的入口调用其他辅助模块完成程序功能;模块varprinter负责打印全局变量,你可以想像该模块是需要访问全局变量并使用它们完成某些具体的业务工作。

代码如下:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
#module varmain.py

import varprinter
name = ''

def loadName():
    global name
    name = 'Hello!'
   

if __name__ == '__main__':
    loadName()
    print 'in main name = ', name
    varprinter.printName()



[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
#module varprinter.py

from varmain import name

def printName():
    print 'in varprinter name = ', name

运行后的结果为:

[Copy to clipboard] [ - ]
CODE:
in main name = Hello!
in varprinter name =

即全局变量name并没有保持。

一些简单的修改如在varprinter.py中把import改成from import,在varmain.py中撤掉loadName()函数,而将name变量的修改直接放到if __name__ == '__main__':下等招数都试过了,效果一样。

各位请调试成功后回帖,另外也不要修改程序的整体结构,在前面已经说清楚了,varmain模块是负责管理全局变量的,可以想像是从数据库或者文件等持久层读入全局变量;varprinter是访问和使用全局变量来完成业务功能的。不知各位高手是否有可行性的建议?谢谢!
我在varmain.py里面加了点东西

name = ''
print 'init name', id(name)

def loadName():
    global name
    global vals
    name = 'Hello!'
    print 'set name:', name, id(name)
   

if __name__ == '__main__':
    loadName()
    print 'in main name = ', name
    varprinter.printName()
    print varprinter.name
    print varprinter.name == name
    print varprinter.name is name
    print id(varprinter.name)
    print id(name)

发现运行结果是
import varprinter
init name 11313208
import varmain:
import varprinter
init name 11313208
set name: Hello! 11840288
in main name =  Hello!
in varprinter name =

False
False
11313208
11840288

我估计在调用loadName()后,varmain里的name被绑定到一个新的字符串常量,
而varprinter.name仍然指向初始值,两个name已经不是同一个东西了
也就没有起到全局变量的作用

我觉得最好是定义一个class,然后把全局变量装在里面,这个全局的对象就可以只绑定一次,
以后只会访问它内部的数据,就不会出现上面的问题了