python-闭包

2019-12-04 15:15:56

闭包这个概念其实很久之前就听说过,之前也有粗略的了解了一点相关的知识,本章对闭包这个概念做一些讨论和总结。

一、概念

闭包这个词初看其实是比较抽象的,那么什么是闭包呢?

闭包的英文是 closure,英文的意思大概是:a function which closes over the environment(scope) in which it was defined。

所以说这里的“闭”不是封闭内部状态,而是封闭外部状态,当外部状态作用域消失的时候,还保留一份在其内部状态中。

所以,从本质上来说,闭包的作用可以理解为突破作用域的技巧。我们知道函数内部的变量是局部变量,即local的,这些变量在函数的外部是没有办法进行访问的,如果我们想要去访问这些变量的时候就需要使用闭包的技术。

二、举例

闭包往往和内部函数绑定在一起,下面举个例子。

def show_msg(name):
    def helper(age):
        print("Name is %s, age is %s" % (name, age))
    return helper


if __name__ == "__main__":
    msg = show_msg("Bob")
    msg(20)
    msg(25)

这里面调用show_msg的时候就产生了一个闭包helper,并且该闭包持有父函数变量name,因此这也意味着,当函数show_msg的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。

另外,我们需要注意一点,就是闭包中直接修改父函数变量的值是不被允许的,需要加上nonlocal的声明才可以进行修改

def money():
    value = 50

    def inner_func(status):
        nonlocal value  # python3 中不支持直接在内部函数中修改父函数的变量数值,如需修改需要声明nonlocal
        if status == 0:
            value -= 1
        else:
            value += 1
        print("Current money : %s", value)

    return inner_func


if __name__ == "__main__":
    func0 = money()
    func0(0)
    func0(1)

  

原文地址:https://www.cnblogs.com/hyserendipity/p/11983645.html