python – 从另一个模块中定义的函数更改模块中的全局变量

我有一个带有main函数的模块,当一个标志为true时,它运行一个循环.

在循环中,调用另一个模块中定义的函数来检查条件,如果它是True,则应该停止主循环.

代码是:

main.py

import other

isRunning = True
def shutdown():
    global isRunning
    isRunning = False

def main():
    while isRunning:
        # some logic here
        other.check()

if __name__ == '__main__':
    main()

other.py

import main

def check():
    someCondition = #some logic to check the condition
    if someCondition:
        main.shutdown()

代码运行启动main.py文件.

问题是当在循环中调用other.check()时,会调用main.shutdown()函数,但主循环会继续运行.在主循环中,isRunning变量始终为True,但在main.shutdown()函数中设置后,我期望它变为False.
为什么会这样?我错过了什么?

我可以重构代码以更智能的方式管理循环退出,但我很想知道是否有一种解决方案来保持这种代码结构.

最佳答案 该问题与正在加载两次的main.py文件有关.当您将其作为脚本运行时,它首先作为__main__加载.它也被other.py导入为常规名称main.

这两个副本彼此完全分开,并且具有单独的全局变量!当other.check调用main.shutdown来修改isRunning全局变量时,它只更改main.isRunning版本,而不是__main __.isRunning.主要功能是检查__main __.isRunning,它永远不会被改变.

有几种方法可以解决这个问题.最好的可能是以某种方式摆脱你的循环导入.虽然循环导入在Python中可以正常工作,但它通常是糟糕设计的症状.将它与任何可能作为脚本运行的模块一起使用是一个非常糟糕的主意.

点赞