一般使用global variable 的情境是這樣的
tutorial1
num = 1def increment():
global num
num += 1
如此以來, 即使不透過傳遞num值到函式裡, 我們也可以將num這個值做增加的動作
但今天有一個這樣的問題, 有兩個檔案
tutorial2
main.py
from test import increment, numglobal num
increment()
print(num)
test.py
global num
num = 0
def increment():
global num
num += 1
結果是0
這樣做就算另兩個檔案的num變為全域變數, 也無法改變原先在test.py的num值, 這邊與我們熟悉的程式語言c/c++ 與 java非常不同, 對我們曾經c++的王者來說一定更不習慣
我們間接看一下, num的reference
tutorial3
main.py
from test import increment, numprint(‘before increment num in main.py, num address is {}’.format(id(num)))
increment()
print(‘final num value {} and address {}’.format(num, id(num)))
test.py
global num
num = 0
print(‘import test.py, num address is {}’.format(id(num)))
def increment():
global num
print(‘call by main.py, before increment, num address is {}’.format(id(num)))
num += 1
print(‘call by main.py, after increment , num address is {}’.format(id(num)))
result:
before increment num in main.py, num address is 140467528860864
call by main.py, before increment, num address is 140467528860864
call by main.py, after increment , num address is 140467528860896
final num value 0 and address 140467528860864
可以注意到 這邊只要我們對這個num 值做了+的動作, 他立刻存到另外的記憶體位置, 但是卻沒有覆蓋回原本的global variable 的位址, 這細部可能要在看python 是如何去實作,而我們熟知的 c 語言有一個 extern 的方法可以讓我們輕鬆的解決這問題
在python中要如何解決呢
tutorial4
我們必須在定義一個globals.py的檔案, 來儲存我們的全域變數
globals.py
def initialize():
global num
num = 1
main.py
import globals
import test
if __name__ == “__main__”:
globals.initialize()
print( globals.num ) # print the initial value
test.increment()
print( globals.num ) # print the value after being modified within test.py
test.py
import globals
def increment():
globals.num += 1
results:
1
2
如此我們便可以透過在宣告一個 globals.py 將我們要改變的全域變數放進裡面, 來讓所有程式都可以讀寫這個global variable
[reference](https://instructobit.com/tutorial/108/How-to-share-global-variables-between-files-in-Python)
以上錯誤 或是 討論可以mail kweisamx0322@gmail.com
github: https://github.com/kweisamx/python-global-variable-in-two-file