Python 局部函數詳解 [Python Function][局部函數作用域][擴大局部函數作用域][“遮蔽”問題及其解決辦法]

您的“關注”和“點贊”,是信任,是認可,是支持,是動力…

如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。

1 Python 局部函數概述

在 Python 函數的內部定義的函數,稱爲局部函數。

舉例如下所示:

# 全局函數 person()
def person():
    # 局部函數 men()
    def men():
        print('局部函數 men()')

    # 局部函數 women()
    def women():
        print('局部函數 women()')

2 局部函數的作用域

2.1 局部函數作用域概述

局部函數默認只能在其所在函數的作用域內使用。

舉例如下所示:

# 全局函數 person()
def person():
    # 局部函數 men()
    def men():
        print('局部函數 men()')

    # 局部函數 women()
    def women():
        print('局部函數 women()')

    men()  # 在所在函數 person() 的作用域內調用局部函數 men()
    women()  # 在所在函數 person() 的作用域內調用局部函數 women()


person()  # 調用全局函數 person()
men()  # 局部函數默認只能在其所在函數的作用域內使用,否則會報錯

運行結果:

局部函數 men()
局部函數 women()
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 16, in <module>
    men()  # 局部函數默認只能在其所在函數的作用域內使用,否則會報錯
NameError: name 'men' is not defined

2.2 擴大局部函數的作用域

將局部函數作爲所在函數的返回值,可以擴大局部函數的使用範圍,既可以在所在函數內部使用,也可以在所在函數的作用域中使用。

舉例如下所示:

# 全局函數 person()
def person():
    # 局部函數 men()
    def men():
        print('局部函數 men()')

    # 局部函數 women()
    def women():
        print('局部函數 women()')

    return men  # 將局部函數 men() 作爲所在函數 person() 的返回值


new_men = person()  # 調用全局函數 person()
new_men()  # 調用局部函數 men()

運行結果:

局部函數 men()

3 “遮蔽”問題及其解決辦法

3.1 “遮蔽”問題描述

局部函數和所在函數中有變量同名,就會發生“遮蔽”問題。

舉例如下所示:

例一,

# 全局函數 person()
def person():
    name = '碼農阿杰'
    # 局部函數 men()
    def men():
        name = '阿杰'  # 覆蓋所在函數中的同名變量(“就近原則”)
        print(name)
    men()


person()  # 調用全局函數 person()

運行結果:

阿杰

例二,

# 全局函數 person()
def person():
    name = '碼農阿杰'
    # 局部函數 men()
    def men():
        print(name)  # 試圖調用所在函數中的 name 變量,會發生“遮蔽”問題,報 UnboundLocalError 錯誤
        name = '阿杰'

    men()


person()  # 調用全局函數 person()

運行結果:

    print(name)  # 試圖調用所在函數中的 name 變量
UnboundLocalError: local variable 'name' referenced before assignment
錯誤提示信息直譯:
local variable 'name' referenced before assignment  
局部變量 name 還沒定義就使用

3.2 “遮蔽”問題解決辦法

使用 nonlocal 關鍵字修飾局部函數中的同名變量,可以解決“遮蔽”問題。

舉例如下所示:

# 全局函數 person()
def person():
    name = '碼農阿杰'
    # 局部函數 men()
    def men():
        nonlocal name  # 使用 nonlocal 關鍵字修飾,避免“遮蔽”
        print(name)  # 試圖調用所在函數中的 name 變量
        name = '阿杰'

    men()


person()  # 調用全局函數 person()

運行結果:

碼農阿杰

【友情鏈接】

微信公衆號:碼農阿杰

博客園

【參考資料】

Python 官網

Python 3.8.2 documentation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章