注:紅色是我增加的注釋
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...