6、局部函数
1)理解局部函数
说明:函数体内定义的函数。默认情况下,局部函数对外隐藏,只能在其封闭函数内使用
2)定义、使用局部函数
def foo():
print('foo函数')
def bar(): # 局部函数
print('bar函数')
bar()
foo()
# bar() # 无法访问
foo函数
bar函数
3)封闭函数返回局部函数
def foo():
print('foo函数')
def bar(): # 局部函数
print('bar函数')
return bar
# foo() 函数的返回值是 bar 函数,因此此处可用 r 变量来保存 bar 函数
r = foo()
print(r, type(r))
foo函数
<function foo..bar at 0x000000B8B7CDA840> <class ‘function’>
# r 此处为函数
r()
bar函数
foo()()
foo函数
bar函数
4)局部函数的变量遮蔽
def test():
name = 'python'
def info():
print('info函数')
# 报错,下面代码为 info 局部函数再次定义 name 局部变量
# 此时 name 变量会遮蔽 test 函数内的 name 局部变量
print('第一次name:', name)
name = 'java'
print('第二次name:', name)
info()
print('第三次name:', name)
test()
info函数
UnboundLocalError: local variable ‘name’ referenced before assignment
解决方式:
def test():
name = 'python'
def info():
print('info函数')
nonlocal name # 声明nama变量不是新的局部变量,而是引用所在封闭函数的局部变量
print('第一次name:', name)
name = 'java'
print('第二次name:', name)
info()
print('第三次name:', name) # name 值改变
test()
info函数
第一次name: python
第二次name: java
第三次name: java
比较:
- nonlocal 和 global 功能相似,都用于避免变量被遮蔽
- global 用于声明访问全局变量,nonlcal 用户声明访问局部函数所在的封闭函数之内的局部变量