最近用Python寫(xiě)代碼,需要用到模塊間的全局變量。
網(wǎng)上四處搜索,發(fā)現(xiàn)普遍做法是把全局變量放到一個(gè)獨(dú)立的模塊中,使用時(shí),導(dǎo)入此全局變量模塊即可。
但是在實(shí)際使用過(guò)程中發(fā)現(xiàn)了些小問(wèn)題:在使用如下代碼導(dǎo)入全局變量模塊時(shí),各個(gè)模塊獲取到的全局變量都是初始值。
from module import global_var
但是如果使用「模塊名.全局變量名」來(lái)訪問(wèn)時(shí),卻又是正常的:
import modulePRint module.global_var
為了弄清其中的原委,我寫(xiě)了個(gè)測(cè)試程序來(lái)仔細(xì)查看其中的細(xì)節(jié):
global_var.py
GLOBAL_VAR = [1, 2, 3]
m1.py
import global_varimport m2print 'm1: before appending: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARglobal_var.GLOBAL_VAR.append('m1')print 'm1: after appending: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARprint 'm1: before calling m2.append():', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARm2.append()print 'm1: after calling m2.append(): ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARprint '-----------------'print 'm1: before assigning: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARglobal_var.GLOBAL_VAR = ['m1']print 'm1: after assigning: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARprint 'm1: before calling m2.assign():', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARm2.assign()print 'm1: after calling m2.assign(): ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VAR
m2.py
import global_vardef append(): print 'm2: before assiging: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VAR global_var.GLOBAL_VAR.append('m2') print 'm2: after assiging: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VARdef assign(): print 'm2: before assiging: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VAR global_var.GLOBAL_VAR = ['m2'] print 'm2: after assiging: ', id(global_var.GLOBAL_VAR), global_var.GLOBAL_VAR
運(yùn)行結(jié)果:
Mac-pastgift:pytest pastgift$ python global_test_import/m1.pym1: before appending: 4457308312 [1, 2, 3]m1: after appending: 4457308312 [1, 2, 3, 'm1']m1: before calling m2.append(): 4457308312 [1, 2, 3, 'm1']m2: before assiging: 4457308312 [1, 2, 3, 'm1']m2: after assiging: 4457308312 [1, 2, 3, 'm1', 'm2']m1: after calling m2.append(): 4457308312 [1, 2, 3, 'm1', 'm2']-----------------m1: before assigning: 4457308312 [1, 2, 3, 'm1', 'm2']m1: after assigning: 4457444848 ['m1']m1: before calling m2.assign(): 4457444848 ['m1']m2: before assiging: 4457444848 ['m1']m2: after assiging: 4457308312 ['m2']m1: after calling m2.assign(): 4457308312 ['m2']
在這種方式下,如果是改變對(duì)象本身的操作(append),各個(gè)模塊內(nèi)部的操作都是針對(duì)于同一個(gè)對(duì)象。
而賦值操作,雖然全局變量所指向的對(duì)象改變了,但是全局變量本身依然在各個(gè)模塊內(nèi)部能夠正確訪問(wèn),這正是我所希望的效果。
global_var.py
GLOBAL_VAR = [1, 2, 3]
m1.py
from global_var import GLOBAL_VARimport m2print 'm1: before appending: ', id(GLOBAL_VAR), GLOBAL_VARGLOBAL_VAR.append('m1')print 'm1: after appending: ', id(GLOBAL_VAR), GLOBAL_VARprint 'm1: before calling m2.append():', id(GLOBAL_VAR), GLOBAL_VARm2.append()print 'm1: after calling m2.append(): ', id(GLOBAL_VAR), GLOBAL_VARprint '-----------------'print 'm1: before assigning: ', id(GLOBAL_VAR), GLOBAL_VARGLOBAL_VAR = ['m1']print 'm1: after assigning: ', id(GLOBAL_VAR), GLOBAL_VARprint 'm1: before calling m2.assign():', id(GLOBAL_VAR), GLOBAL_VARm2.assign()print 'm1: after calling m2.assign(): ', id(GLOBAL_VAR), GLOBAL_VAR
m2.py
from global_var import GLOBAL_VARdef append(): global GLOBAL_VAR print 'm2: before assiging: ', id(GLOBAL_VAR), GLOBAL_VAR GLOBAL_VAR.append('m2') print 'm2: after assiging: ', id(GLOBAL_VAR), GLOBAL_VARdef assign(): global GLOBAL_VAR print 'm2: before assiging: ', id(GLOBAL_VAR), GLOBAL_VAR GLOBAL_VAR = ['m2'] print 'm2: after assiging: ', id(GLOBAL_VAR), GLOBAL_VAR
運(yùn)行結(jié)果:
Mac-pastgift:pytest pastgift$ python global_test_from_import/m1.pym1: before appending: 4539998360 [1, 2, 3]m1: after appending: 4539998360 [1, 2, 3, 'm1']m1: before calling m2.append(): 4539998360 [1, 2, 3, 'm1']m2: before assiging: 4539998360 [1, 2, 3, 'm1']m2: after assiging: 4539998360 [1, 2, 3, 'm1', 'm2']m1: after calling m2.append(): 4539998360 [1, 2, 3, 'm1', 'm2']-----------------m1: before assigning: 4539998360 [1, 2, 3, 'm1', 'm2']m1: after assigning: 4540135112 ['m1']m1: before calling m2.assign(): 4540135112 ['m1']m2: before assiging: 4539998360 [1, 2, 3, 'm1', 'm2']m2: after assiging: 4540135040 ['m2']m1: after calling m2.assign(): 4540135112 ['m1']
這次,運(yùn)行結(jié)果和上次略有不同。
改變對(duì)象本身的操作(append)和之前的例子一樣,全局變量始終指向相同的對(duì)象。
但是賦值操作就比較奇怪了。注意標(biāo)紅部分,每個(gè)模塊第一次獲取到的這個(gè)「全局變量」都是相同id的對(duì)象。即使這個(gè)「全局變量」在其他模塊中已經(jīng)被重新賦值,但在本模塊中依然指向的是最原始的id。
顯然,這個(gè)算不上是「全局變量」了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注