1. 程式人生 > >Python 區域性變數與全域性變數

Python 區域性變數與全域性變數

問題由來:
考慮到想在執行結束後的使用者空間裡面檢視一下資料,我把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()