python 經驗:把全局變量放在一個類中


注:紅色是我增加的注釋

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 *" 否則你會發現不能對簡單全局變量賦值


免責聲明!

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



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