闭包

     学习了 2 分钟,就返回 2 ,然后隔了一阵子,我学习了 10 分钟,那么就返回 12 ,像这样把学习时间一直累加下去

time = 0


def insert_time(min):
    global  time
    time = time + min
    return  time

print(insert_time(2))
print(insert_time(10))

  使用了全局变量,我们在开发中能尽量避免使用全局变量的就尽量避免使用。因为不同模块,不同函数都可以自由的访问全局变量,可能会造成全局变量的不可预知性

  使用闭包来解决一下,先直接看代码

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

  用了 nonlocal 关键字,表示在函数或其他作用域中使用外层(非全局)变量

  内部函数的局部作用域中可以访问外部函数局部作用域中变量的行为,我们称为: 闭包。更加直接的表达方式就是,当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包

  有没有什么办法来验证一下这个函数就是闭包呢?

  所有函数都有一个 __closure__ 属性,如果函数是闭包的话,那么它返回的是一个由 cell 组成的元组对象。cell 对象的 cell_contents 属性就是存储在闭包中的变量。

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.__closure__)
print(f(2))
print(time)
print(f.__closure__[0].cell_contents)
print(f(10))
print(time)
print(f.__closure__[0].cell_contents)

---------------------------------------------------
(<cell at 0x000002614D28FFD0: int object at 0x000002613B7A6910>,)
2
0
2
12
0
12

  传进来的值一直存储在闭包的 cell_contents 中,因此,这也就是闭包的最大特点

posted on 2022-05-11 23:26  溪水静幽  阅读(22)  评论(0)    收藏  举报