[Python]_[初級]_[關於如何使用全域性變數的問題]
阿新 • • 發佈:2018-12-01
場景
1.在做python
開發時, 有時候會用到全域性變數, 比如某個配置需要影響到程式的生命週期, 或者多執行緒程式裡, 需要判斷某個變數是True
, 從而知道需要停止任務執行.
2.C++
的全域性變數只需要在標頭檔案裡宣告一個extern int gTime;
即可, 之後在.cpp
裡定義變數即可. 之後其他檔案如果需要用到這個變數, 就包含這個標頭檔案即可. 如果需要跨動態庫使用的話, 還需要單獨編譯一個帶extern int GetTime()
的動態庫才行, 之後其他庫只需要呼叫這個匯出函式GetTime
的動態庫即可.
3.Java
是基於類載入機制的, 同一個類可以通過不同的代理多次載入, 所以沒有全域性變數.
說明
1.python
全域性變數是基於模組的, 因為每個模組只有一個例項. 在宣告全域性變數時, 只需要在需要全域性使用的.py
檔案裡A.py
宣告一個全域性變數即可.x = False
,之後匯入import A
, 並對A.x = True
賦值。按照docs.python.org
的說明, 使用的時候都不需要宣告global x
, 只需要全模組路徑即可.
例子
檔案的層次關係:
1.src/gui/utility.py
gIsStop = False
2.src/gui/window/test_global2.py
import src.gui.utility def GetGlobal(): print (__file__) return src.gui.utility.gIsStop def SetGlobal(value): src.gui.utility.gIsStop = value
3.src/test_global1.py
import src.gui.utility import importlib from src.gui import utility import _thread import time def worker(): test_global2 = importlib.import_module('src.gui.window.test_global2') print(test_global2.GetGlobal()) test_global2.SetGlobal(False) print(__file__) print(src.gui.utility.gIsStop) if __name__ == "__main__": print (__file__,) print (src.gui.utility.gIsStop) utility.gIsStop = True _thread.start_new_thread(worker, ()) time.sleep(10)
輸出:
E:/Project/Sample/test-python/src/test_global1.py
False
E:\Project\Sample\test-python\src\gui\window\test_global2.py
True
E:/Project/Sample/test-python/src/test_global1.py
False
參考
How do I share global variables across modules?
visibility-of-global-variables-in-imported-modules
python-dynamic-import-how-to-import-from-module-name-from-variable
globals()
Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).