- 概念
1. 在函数嵌套的前提下
2. 内层函数引用了外层函数的变量(包括参数)
3. 外层函数,又把内层函数当做返回值进行返回
4. 内层函数 + 所引用的外层变量,称为闭包
- 形式
def outside(a):
b = 10
def inner():
print(a)
print(b)
return inner
result = outside(10)
result()
- 场景
# 外层函数,根据不同的参数,来生成不同作用功能的函数
def line_config(content, length):
def line():
print("-"*(length // 2) + content + "-"*(length // 2))
return line
line1 = line_config("秦子阳", 40)
line1()
line2 = line_config("小清新", 80)
line2()
- 注意
1. 闭包中, 若要修改引用的外层变量, 需要使用 nonlocal 声明变量;
否则当做是闭包内, 新定义的变量
def demo():
num = 66
def inner():
nonlocal num
num = 88
print(num)
print(num)
return inner
result = demo()
result()
2. 值捕获
(1) 闭包在 "其被定义的上下文中" 捕获变量;
(2) 即使定义这些变量的 "原作用域已经不存在";
(3) 闭包仍然可以在 "被调用时" "引用和修改这些值"
def test():
funcs = []
for i in range(1, 4):
def test2(num):
def inner():
print(num)
return inner
funcs.append(test2(i))
return funcs
newFuncs = test()
print(newFuncs)
newFuncs[0]()
newFuncs[1]()
newFuncs[2]()