2013-05-26 18 views
3

我通过修改主模块中的全局值来切换程序模式。python变量 - 模块之间的不和谐

该更改反映在源自该模块内部的以下函数调用中,但其他模块调用相同函数时不会发生该更改。

当函数调用来自外部时,主模块是否使用旧/外部/重复值?

main_module.py

import second_module 

mode = 1 

def print_mode(): 
    print 'Mode: ' + str(mode) 

if __name__ == "__main__": 
    print_mode() 
    mode = 2 
    print_mode() 
    second_module.problem() 

second_module.py

from main_module import print_mode 

def problem(): 
    print_mode() 

输出

$ python main_module.py 
Mode: 1 
Mode: 2 
Mode: 1 
+0

'global'关键字不会在那里,因为它在模块范围 – Eric

+0

谢谢,删除它。 – fivecode

回答

2

您提供的文件在命令行中作为名为__main__的模块执行(条件__name__ == '__main__'正在依赖于此)。模块通常只导入一次,未来的导入会再次引用相同的模块名称。

但是,这种机制是基于模块名称。 from main_module import print_mode寻找一个名为main_module的模块,但目前还没有这样的模块,因此文件再次被加载,并创建了一个名为main_module的单独模块。这需要再次执行来自main_module.py的代码,该代码再次初始化mode = 1,但是不符合上述条件,因此不会执行任何其他操作(例如mode = 2)。

所以你最终有三个模块:__main__,second_modulemain_module__main__.mode == 2,但main_module.mode == 1second_module.print_mode is main_module.print_mode,所以print_mode呼叫second_modulemain_module.mode这是2

出不具有任何__main__逻辑简单的办法:把你的入口点函数main()main_module.py,然后创建一个单独的脚本,除了导入main_module以外,不会执行任何操作,并且会调用main_module.main()。或者,不要使用全局变量;-)

+0

谢谢,解决了!以后会把'__main__'远离一切。 完全避免全局变量会很好,但我不明白如何维护程序模式/状态。 – fivecode

+1

另一种方法是在文件顶部添加'if __name__ =='__main__':import main_module; main_module.main()' – Eric

+0

听起来像是在'__main__'导入过程中再次导入同一个模块,然后继续。这不会给我们三个模块吗? – fivecode