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

时间:2016-03-11 08:57:13

标签: python global

我有一个带有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,但我希望在False函数中设置后变为main.shutdown()。 为什么会这样?我错过了什么?

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

2 个答案:

答案 0 :(得分:4)

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

这两个副本彼此完全分开,并且具有单独的全局变量!当other.check调用main.shutdown来修改isRunning全局变量时,它只会更改main.isRunning版本,而不会更改__main__.isRunning。主要功能是检查__main__.isRunning哪些内容无法更改。

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

答案 1 :(得分:3)

试试这个:

import other


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

if __name__ == '__main__':
    main()

other.py

import main

isRunning = True
def run():
    return isRunning

def check():
    global isRunning
    someCondition = #some logic to check the condition
    if someCondition:
        isRunning = False

如果我是你,我会使用对象和类......,全局方法和变量不是"调试和维护友好"