1. 程式人生 > >[Python]_[初級]_[關於如何使用全域性變數的問題]

[Python]_[初級]_[關於如何使用全域性變數的問題]

場景

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).