您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
文章目录
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()
运行结果:
码农阿杰