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)