關鍵字 (keyword) nonlocal 用來在巢狀函數內宣告外部變數,這是讓巢狀函數能夠使用外層函數的區域變數 (local variable) 。
這裡先來看看區域變數的概念,首先建立的變數 (variable) a 為全域變數,函數 (function) function1() 內設定的變數 a 為 function1() 內的區域變數, function1() 內的巢狀函數 function2() 內也有個相同名稱的區域變數 a ,由 print() 函數分別印出三個 a 的值,可以看到三個變數都是符合他們一開始建立的整數 0 、 1 、 2
a = 0
def function1():
a = 1
def function2():
a = 2
print("function2: ", a)
function2()
print("function1: ", a)
function1()
print("global: ", a)
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:nonglobal01.py
# 功能:示範 nonglobal 陳述
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 nonglobal01.py |
function2: 2 |
function1: 1 |
global: 0 |
$ |
接下來定義跟 function1() 類似的 function3() , function3() 裡頭也有巢狀函數 function4() ,差別是 function4() 裡的變數 a 被宣告為 nonlocal ,因此 function4() 裡頭的 a 就跟 function3() 的 a 是同樣的,在 function4() 裡面重新設定 a 為整數 2 ,最後 function3() 的 a 也變成整數 2
a = 0
def function3():
a = 1
def function4():
nonlocal a
a = 2
print("function4: ", a)
function4()
print("function3: ", a)
function3()
print("global: ", a)
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:nonglobal02.py
# 功能:示範 nonglobal 陳述
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 nonglobal02.py |
function4: 2 |
function3: 2 |
global: 0 |
$ |
最後來看看 nonlocal 跟 global 的比較,這邊定義跟 function1() 類似的 function5() , function5() 內有巢狀函數 function6() ,由於 global 是將函數內的變數宣告為全域變數,因此這邊 function6() 內的變數 a 被宣告為 global ,當 function6() 的 a 被設定成 2 之後,全域變數 a 也變成了 2
a = 0
def function5():
a = 1
def function6():
global a
a = 2
print("function6: ", a)
function6()
print("function5: ", a)
function5()
print("global: ", a)
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:nonglobal03.py
# 功能:示範 nonglobal 陳述
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 nonglobal03.py |
function6: 2 |
function5: 1 |
global: 2 |
$ |
相關教學影片