簡體   English   中英

無法看到來自不同 Python 模塊的全局變量的更改

[英]Unable to see changes to a global variable from a different Python module

考慮以下兩個文件的 Python 應用程序,即app.py

#!/usr/bin/env python3
import other


MY_DICT = {'initial': 10}


def main():
    print('before main:', MY_DICT)
    MY_DICT['foo'] = 20
    MY_DICT['bar'] = 30
    print('after changes:', MY_DICT)
    other.check_dict()
    print('back in main:', MY_DICT)


if __name__ == '__main__':
    main()

other.py

def check_dict():
    from app import MY_DICT
    print('inside other:', MY_DICT)

我想讓MY_DICT中的app.pyother.py中可見。 它是可見的,但我無法更改它。 這是 output 如果我用 Python 3.8.0 運行./app.py

before main: {'initial': 10}
after changes: {'initial': 10, 'foo': 20, 'bar': 30}
inside other: {'initial': 10}
back in main: {'initial': 10, 'foo': 20, 'bar': 30}

當從other.py檢查時,不僅MY_DICT回到了它最初的 state ,當我回到 main.py 時,它也回到了改變后的main.py 這里發生了什么,我如何使它成為一個真正的全局變量?

我已經讀過這個問題並確保我在check_dict中重新導入MY_DICT

解決方案:不要那樣做。 不要將入口點 Python 腳本作為模塊導入。 創建一個單獨的小文件,該文件永遠不會被任何其他人導入,並且旨在從 shell 運行。

當您以 ./app.py 運行應用程序時, ./app.py實際上將您的app.py作為名為__main__的模塊加載。 但是你的other.pyimport app ,所以它導入了一個名為app的單獨模塊,它只是巧合地從同一個源文件app.py

現在您的程序中加載了兩個app.py實例,每個實例都有一個單獨的MY_DICT 您的__main__模塊看到自己的sys.modules['__main__'].MY_DICT ,但other模塊訪問sys.modules['a'].MY_DICT 您可以通過在main()check_dict()中打印id(MY_DICT)來檢查這一點:它們是不同的。 在此處查看更多詳細信息。

從技術上講,您可以import __main__ as appother.py中。 但是,當有人試圖以任何其他不涉及啟動./app.py的方式使用other.py時,這將中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM