国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Python中模塊間全局變量的使用上的注意

2019-11-14 17:36:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近用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é):

 

 

1. import module

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),這正是我所希望的效果。

 

 

2. from module import GLOBAL_VAR

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è)算不上是「全局變量」了。

 


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 册亨县| 滦南县| 徐水县| 泸水县| 青川县| 浦城县| 旬阳县| 仙桃市| 鄂托克前旗| 宜阳县| 五常市| 昭通市| 雅安市| 根河市| 康乐县| 荣昌县| 山西省| 文昌市| 洛宁县| 东乌珠穆沁旗| 班玛县| 宁武县| 永嘉县| 广德县| 商河县| 蚌埠市| 镶黄旗| 乌苏市| 长宁县| 黄冈市| 灌南县| 宝鸡市| 永顺县| 集贤县| 安宁市| 夏河县| 南木林县| 新疆| 伊宁县| 南召县| 济源市|