python — 怎麼在兩個檔案之間分享全域變數

ss
4 min readSep 25, 2018

--

一般使用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

--

--