一. 使用 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 再申明, 直接使用就可以了
