python变量 - 跨模块的不和谐

时间:2013-05-26 12:02:29

标签: python scope duplication

我通过修改主模块中的全局值来切换程序模式。

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

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

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

1 个答案:

答案 0 :(得分: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 == 2main_module.mode == 1second_module.print_mode is main_module.print_mode,因此print_mode中的second_module来电是main_module.mode,即{2}。

简单的方法是在__main__中没有任何逻辑:将您的入口点放在main()中的函数main_module.py中,然后创建一个单独的脚本,该脚本不执行任何其他操作而不是导入main_module并致电main_module.main()。或者,不要使用全局变量; - )