python 經驗 把全域性變數放在乙個類中

2022-02-17 10:08:51 字數 1950 閱讀 8476

注:紅色是我增加的注釋

add by zhj:其實python中的import, from-import語句是建立新的同名變數指向引入的模組和模組屬性,這也就解釋了下面的情況。

我們應盡量不用全域性變數,比如當乙個模組中的兩個函式要用同乙個變數時,我們可以嘗試把這兩個函式寫在乙個類中,而該變數定義

成類變數。如果非要用全域性變數,建議把它們全部定義在乙個類中,通過「類名.類變數名」來使用它們,這樣ok了,根本不用什麼globle

關鍵字了。

原文:--   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 *" 否則你會發現不能對簡單全域性變數賦值

python 全域性變數

應該盡量避免使用全域性變數。不同的模組都可以自由的訪問全域性變數,可能會導致全域性變數的不可預知性。對全域性變數,如果程式設計師甲修改了 a的值,程式設計師乙同時也要使用 a,這時可能導致程式中的錯誤。這種錯誤是很難發現和更正的。全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域...

Python 全域性變數

應該盡量避免使用全域性變數。不同的模組都可以自由的訪問全域性變數,可能會導致全域性變數的不可預知性。對全域性變數,如果程式設計師甲修改了 a的值,程式設計師乙同時也要使用 a,這時可能導致程式中的錯誤。這種錯誤是很難發現和更正的。全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域...

python全域性變數

python中global關鍵字主要作用是宣告變數的作用域。在c語言中,由於變數一定是先宣告,後使用,所以我們可以清楚的知道,現在使用的變數是全域性還是區域性,比如 cpp view plain copy inta 5 void test void void test1 void void main...