Image Description

通过一个案例来了解闭包:开发一个记录学习时间的软件,学习一分钟返回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

运行流程

Image

在内部函数的局部作用域中,访问外部函数局部作用域中变量的行为,就叫做闭包。某个函数被当成对象返回时,夹带了外部的变量,就形成了一个闭包。