3

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

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

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

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
4

1 回答 1

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 == 1, 和second_module.print_mode is main_module.print_mode, 所以print_mode调用second_module指的main_module.mode是 2。

简单的出路是没有任何逻辑__main__:将入口点放在一个函数main()中,然后创建一个单独的脚本,该脚本除了导入和调用main_module.py之外不做任何事情。或者,不要使用全局变量 ;-)main_modulemain_module.main()

于 2013-05-26T12:08:57.297 回答