我有一個帶有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中可以正常工作,但它通常是糟糕設計的症狀.将它與任何可能作為腳本運作的子產品一起使用是一個非常糟糕的主意.