Python區域性函式及用法詳解

大雄45發表於2023-02-21
導讀 區域性函式有哪些特徵,在使用時需要注意什麼呢?接下來就給讀者詳細介紹 Python 區域性函式的用法,對Python區域性函式相關知識感興趣的朋友跟隨小編一起看看吧
Python區域性函式及用法

透過前面的學習我們知道,Python 函式內部可以定義變數,這樣就產生了區域性變數,有讀者可能會問,Python 函式內部能定義函式嗎?答案是肯定的。Python 支援在函式內部定義函式,此類函式又稱為區域性函式。

那麼,區域性函式有哪些特徵,在使用時需要注意什麼呢?接下來就給讀者詳細介紹 Python 區域性函式的用法。

首先,和區域性變數一樣,預設情況下區域性函式只能在其所在函式的作用域內使用。舉個例子:

#全域性函式
def outdef ():
    #區域性函式
    def indef():
        print(")
    #呼叫區域性函式
    indef()
#呼叫全域性函式
outdef()

程式執行結果為:


就如同全域性函式返回其區域性變數,就可以擴大該變數的作用域一樣,透過將區域性函式作為所在函式的返回值,也可以擴大區域性函式的使用範圍。例如,修改上面程式為:

#全域性函式
def outdef ():
    #區域性函式
    def indef():
        print("呼叫區域性函式")
    #呼叫區域性函式
    return indef
#呼叫全域性函式
new_indef = outdef()
呼叫全域性函式中的區域性函式
new_indef()

程式執行結果為:

呼叫區域性函式

因此,對於區域性函式的作用域,可以總結為:如果所在函式沒有返回區域性函式,則區域性函式的可用範圍僅限於所在函式內部;反之,如果所在函式將區域性函式作為返回值,則區域性函式的作用域就會擴大,既可以在所在函式內部使用,也可以在所在函式的作用域中使用。

以上面程式中的 outdef() 和 indef() 為例,如果 outdef() 不將 indef 作為返回值,則 indef() 只能在 outdef() 函式內部使用;反之,則 indef() 函式既可以在 outdef() 函式內部使用,也可以在 outdef() 函式的作用域,也就是全域性範圍內使用。

另外值得一提的是,如果區域性函式中定義有和所在函式中變數同名的變數,也會發生“遮蔽”的問題。例如:

#全域性函式
def outdef ():
    name = "所在函式中定義的 name 變數"
    #區域性函式
    def indef():
        print(name)
        name = "區域性函式中定義的 name 變數"
    indef()
#呼叫全域性函式
outdef()

執行此程式,Python 直譯器會報如下錯誤:

UnboundLocalError: local variable 'name' referenced before assignment

此錯誤直譯過來的意思是“區域性變數 name 還沒定義就使用”。導致該錯誤的原因就在於,區域性函式 indef() 中定義的 name 變數遮蔽了所在函式 outdef() 中定義的 name 變數。再加上,indef() 函式中 name 變數的定義位於 print() 輸出語句之後,導致 print(name) 語句在執行時找不到定義的 name 變數,因此程式報錯。

由於這裡的 name 變數也是區域性變數,因此前面章節講解的 globals() 函式或者 globals 關鍵字,並不適用於解決此問題。這裡可以使用 Python 提供的 nonlocal 關鍵字。

例如,修改上面程式為:

#全域性函式
def outdef ():
    name = "所在函式中定義的 name 變數"
    #區域性函式
    def indef():
        nonlocal name
        print(name)
        #修改name變數的值
        name = "區域性函式中定義的 name 變數"
    indef()
#呼叫全域性函式
outdef()

程式執行結果為:

所在函式中定義的 name 變數

到此這篇關於Python區域性函式及用法(含nonlocal關鍵字)的文章就介紹到這了

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2933020/,如需轉載,請註明出處,否則將追究法律責任。

相關文章