闭包的形成条件:
- 函数嵌套
- 内部函数使用外部函数的变量或者参数
- 外部函数返回内部函数。这个使用外部函数变量的内部函数称为闭包
按照容易理解的意思分析一下
- func_out()的返回值是func_inner函数,所以func指代的就是func_inner函数
- 调用func函数,实际上调用的是func_inner函数
- 内部函数func_inner使用了外部函数func_out的变量num1,并且func_out的返回值是func_inner,形成了闭包
- 输出——结果: 15
def func_out():
num1 = 10
def func_inner(num2):
num = num1 + num2
print('结果:',num)
return func_inner
# 创建闭包对象
func = func_out()
func(5)
# 结果: 15
分析:
- Person(name)返回值是speak,Tom指代的就是speak
- 调用Tom(arg)实际调用speak(arg),此时外部函数name参数值为Tom
- 则输出——Tom:我是你哥哥
- Jerry请自行理解
def person(name):
def speak(msg):
print(name+':'+msg)
return speak
Tom = person('Tom')
Jerry = person('Jerry')
Tom('我是你哥哥')
Jerry('我是老鼠,你是猫')
修改闭包外部函数的变量值
def func_out():
num1 = 10
def func_in():
# 直接给num1赋值其实是在内部函数的定义了一个新的局部变量num1,而不是使用了外部函数变量
# 要修改闭包外部函数变量使用nonlocal关键字
nonlocal num1
num1 = 20
num = num1 + 10
print('结果:',num)
return func_in
func = func_out()
func()