Python 速查手冊

4.9 簡單陳述 nonlocal

本書已有新版,請參考 Python 簡易手冊 - 目錄

關鍵字 (keyword) nonlocal 用來在巢狀函數內宣告外部變數,這是讓巢狀函數能夠使用外層函數的區域變數 (local variable) 。

這裡先來看看區域變數的概念,首先建立的變數 (variable) a 為全域變數,函數 (function) function1() 內設定的變數 afunction1() 內的區域變數, function1() 內的巢狀函數 function2() 內也有個相同名稱的區域變數 a ,由 print() 函數分別印出三個 a 的值,可以看到三個變數都是符合他們一開始建立的整數 012

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
$

最後來看看 nonlocalglobal 的比較,這邊定義跟 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
$

相關教學影片

上一頁: 4.8 簡單陳述 global
Python 速查手冊 - 目錄
下一頁: 4.10 複合陳述 if elif else
回 Python 教材首頁
回程式語言教材首頁