注:紅色是我增加的注釋
add by zhj:其實python中的import, from-import語句是創建新的同名變量指向引入的模塊和模塊屬性,這也就解釋了下面的情況。
我們應盡量不用全局變量,比如當一個模塊中的兩個函數要用同一個變量時,我們可以嘗試把這兩個函數寫在一個類中,而該變量定義
成類變量。如果非要用全局變量,建議把它們全部定義在一個類中,通過“類名.類變量名”來使用它們,這樣OK了,根本不用什么globle
關鍵字了。
原文:http://www.2cto.com/kf/201307/227572.html
-- a.py --
PWD = None
def func1():
global PWD
PWD="pwd"
print "PWD in func1 is: " + PWD
-- b.py --
from a import * #創建新變量PWD,func1,它們與a.py模塊中的變量PWD,func1屬性不同的名稱空間,指向相同的對象,其實變量就是指針
func1() #進入a.py模塊的名稱空間,修改a.py中PWD指針,指向新的對象
print "PWD after call func1() is: " + str(PWD) #a.py中PWD和b.py中的PWD是兩個指針,指向同一個對象,a.py中的PWD指向了新的對象,這對b.py中的PWD無影響
執行 python b.py 結果如下
PWD in func1 is: pwd
PWD after call func1() is: None
剛開始我認為在函數中給全局變量的賦予的值, 並不能傳遞回去, 就是說
global PWD 只是把全局變量的傳遞給局部變量 PWD, 而后用戶都在對局部變量 PWD進行操作, 但並不是這樣
看下面例子, 只是改了 import 語句
--- b.py ---
import a
a.func1()
print "PWD after call func1() is: " + str(a.PWD)
輸出變為
PWD in func1 is: pwd
PWD after call func1() is: 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
貌似我的結論成立:
global 只能改本 module ( 此 py 文件 ) 中的全局變量
但如果全局變量是 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
結論:
最好不要使用 "from a import *" 否則你會發現不能對簡單全局變量賦值
