通过一个案例来了解闭包:开发一个记录学习时间的软件,学习一分钟返回1,再学习10分钟返回11,这样一直把学习时间累加下去。
创建一个全局变量来记录时间,用一个方法来新增每次的学习时间:
time = 0
def insert_time(min):
time = time + min
return time
print(insert_time(2))
print(insert_time(10))
上面的代码实际运行会报错,因为函数 insert_time使用了和全局变量相同的名称并改变了该变量的值,该全局变量成了局部变量,在函数中没有进行定义就引用了,造成了报错。
需要这样修改,通过关键字 global引用全局变量:
time = 0
def insert_time(min):
global time
time = time + min
return time
print(insert_time(2))
print(insert_time(10))
输出:
2
12
但开发中应该尽量避免使用全局变量,不同模块的不同函数都能访问全局变量,会造成全局变量的不可预知性。
闭包来解决
time = 0
def study_time(time):
def insert_time(min):
nonlocal time
time = time + min
return time
return insert_time
f = study_time(time)
print(f(2))
print(time)
print(f(10))
print(time)
输出结果
2
0
12
0
运行流程
在内部函数的局部作用域中,访问外部函数局部作用域中变量的行为,就叫做闭包。某个函数被当成对象返回时,夹带了外部的变量,就形成了一个闭包。