您的“關注”和“點贊”,是信任,是認可,是支持,是動力…
如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。
文章目錄
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()
運行結果:
碼農阿杰