从另一个模块中定义的函数更改模块中的全局变量
Change global variable in a module from a function defined in another module
我有一个模块,其主要功能是 运行 标志为真时的循环。
在循环中,有一个对另一个模块中定义的函数的调用,该函数检查条件,如果为真,则应停止主循环。
密码是:
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()
函数,但主循环保持运行ning。在主循环中,isRunning
变量始终是 True
,但我期望它在 main.shutdown()
函数中设置后变为 False
。
为什么会这样?我错过了什么?
我可以重构代码以更智能的方式管理循环退出,但我很想知道是否有保持这种代码结构的解决方案。
试试这个:
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
如果我是你我会使用对象和 类...,全局方法和变量不是 "debug and maintenance friendly"
此问题与 main.py
文件被加载两次有关。当您 运行 它作为脚本时,它首先作为 __main__
加载。它也被 other.py
作为其常规名称导入 main
.
两个副本完全独立,并且有独立的全局变量! other.check
调用main.shutdown
修改isRunning
全局变量时,只改变main.isRunning
版本,不会改变__main__.isRunning
。主要功能是检查 __main__.isRunning
永远不会改变。
您可以通过多种方式解决此问题。最好的办法可能是以某种方式摆脱你的循环导入。虽然循环导入 可以 在 Python 中正常工作,但它通常是糟糕设计的症状。将它与任何可能 运行 作为脚本的模块一起使用是一个非常糟糕的主意。
我有一个模块,其主要功能是 运行 标志为真时的循环。 在循环中,有一个对另一个模块中定义的函数的调用,该函数检查条件,如果为真,则应停止主循环。
密码是:
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()
函数,但主循环保持运行ning。在主循环中,isRunning
变量始终是 True
,但我期望它在 main.shutdown()
函数中设置后变为 False
。
为什么会这样?我错过了什么?
我可以重构代码以更智能的方式管理循环退出,但我很想知道是否有保持这种代码结构的解决方案。
试试这个:
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
如果我是你我会使用对象和 类...,全局方法和变量不是 "debug and maintenance friendly"
此问题与 main.py
文件被加载两次有关。当您 运行 它作为脚本时,它首先作为 __main__
加载。它也被 other.py
作为其常规名称导入 main
.
两个副本完全独立,并且有独立的全局变量! other.check
调用main.shutdown
修改isRunning
全局变量时,只改变main.isRunning
版本,不会改变__main__.isRunning
。主要功能是检查 __main__.isRunning
永远不会改变。
您可以通过多种方式解决此问题。最好的办法可能是以某种方式摆脱你的循环导入。虽然循环导入 可以 在 Python 中正常工作,但它通常是糟糕设计的症状。将它与任何可能 运行 作为脚本的模块一起使用是一个非常糟糕的主意。