Python 區域性變數與全域性變數
阿新 • • 發佈:2019-01-09
問題由來:
考慮到想在執行結束後的使用者空間裡面檢視一下資料,我把data1作為全域性變數來進行處理。
data1 = []
function a1()
data1 = readData
function a2()
data1.dealData
if __name__ == "__main__":
a1()
a2()
此時,a2()函式沒有任何輸出,即data1為空。
語法基礎:
1、函式內部的變數名如果第一次出現,且出現在=前面,即被視為定義一個區域性變數,不管全域性域中有沒有用到該變數名,函式中使用的將是區域性變數。
num = 100
def func():
num += 100#這裡可以還原成原來的式子:num = num + 100
print(num)
func()
num首先被當成了一個區域性變數,到等號右側以後發現這個變數還沒有賦值就被用於計算,於是報錯。
2、函式內部的變數名如果第一次出現,且出現在=後面,且該變數在全域性域中已定義,則這裡將引用全域性變數,如果該變數在全域性域中沒有定義,當然會出現“變數未定義”的錯誤。
num = 100
def func():
a = num + 1
print(a)
func()
此時的引用的是全域性變數中的num。其實此處可以再進行總結:除去“=”的賦值操作外的所有操作我們都認為會進行全域性變數的引用。
3、我們從第一個說明也能看出來,程式執行是會先查詢區域性變數,如果沒有找到才會去查詢全域性變數。
4、在函式中,如果想給全域性變數賦值,需要在變數前面加上global關鍵字。
num = 100
def func():
global num
num += 100
print(num)
func()
事實上,在關於區域性變數跟全域性變數的討論,我們還可以看關於“這個變數的引用是否明確”來判斷。
在num += 1 這句中,它是“有歧義的“,因為num既可以是表示引用全域性變數,也可以是建立一個新的區域性變數,所以在python中,預設它的行為是建立區域性變數並使用該變數,除非顯式宣告global.
在a = num + 1這句中,它是“明確的”,因為如果把num當作是區域性變數的話,它會報錯,所以它只能是引用全域性的num,故不需要多此一舉顯式宣告global。
solution:
data1 = []#這個拿掉貌似也沒有問題
function a1()
global data1
data1 = readData
function a2()
data1.dealData
if __name__ == "__main__":
a1()
a2()