跨模塊全局變量的使用問題


一. 使用 from p import *  會影響全局變量使用

a.py 文件

PWD = None
 
 
def func1():
    global PWD
    PWD="pwd"
    print "PWD in func1 is: " + PWD

p.py 文件

from a import *
func1()
print "PWD after call func1() is: " + str(PWD)

執行p.py文件

執行 python b.py 結果如下
PWD in func1 is: pwd
PWD after call func1() is: None

上述結論:認為在函數中給全局變量的賦予的值, 並不能傳遞回去, 就是說global PWD 只是把全局變量的傳遞給局部變量 PWD,全局變量還是沒有改變。外部模塊文件調用還是使用沒有改變的值。global 只能改本 module ( 此 py 文件 ) 中的全局變量

再次舉例:

a.py 增加一個函數

-------------------------  a.py ------------------------

PWD = None
 
def func1():
    global PWD
    PWD="pwd"
    print "PWD in func1 is: " + PWD
 
 
def func2():
    global PWD
    print "PWD in func2 is: " + PWD

-------------------------   b.py ------------------------

from a import *
 
print dir()
func1()
func2()

輸出結果為

PWD in func1 is: pwd
PWD in func2 is: pwd

-------------------------------------------------------------------------------------------------------

但如果全局變量是 list 或 dict 類型, 就沒有問題

-------------------------  a.py ------------------------

GLIST = ["glist"]
 
def func1():
    global GLIST
    GLIST[0] = "glist changed"

-------------------------   b.py ------------------------

from a import *
 
print GLIST[0]

運行  python b.py , 打印

glist changed

 

-- b.py -- 甚至可以不用 global GLIST

def func1():
    GLIST[0] = "glist changed"

這就好比雖然 GLIST只讀, 但它的仿佛是個指針, 指向的位置卻可寫

結論: 

最好不要使用 "from a import *" 否則對對全局變量賦值在其他module中不能使用. ( 最好用 import a, 在其他 module 通過 a.gvar 使用)

另外值得一提的是: 如果只是讀取全局變量( 不修改), 並不需要用 global 再申明, 直接使用就可以了

 

  1. def func1():
  2.  
    GLIST[0] = "glist changed"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM