20191030-Python实现闭包

打算在过年前每天总结一个知识点,所以把自己总结的知识点分享出来,中间参考了网络上很多大神的总结,但是发布时候因为时间太久可能没有找到原文链接,如果侵权请联系我删除

20191030:闭包

首先一个函数,如果函数名后紧跟一对括号,相当于现在我就要调用这个函数,如果不跟括号,相当于只是一个函数的名字,里面存了函数所在位置的引用。

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

def myClosure(msg):
    closuremsg = "闭包msg"
    def inner():
        print(closuremsg)
        return closuremsg+msg
    # 返回内部函数的应用
    return inner
a = myClosure("闭包测试")
print(a())
b = myClosure("闭包是否能识别变量测试")
print(b())
输出结果:
闭包msg
闭包msg闭包测试
闭包msg
闭包msg闭包是否能识别变量测试

按理说myClosure函数调用结束后closuremsg参数的作用域结束,closuremsg内存空间释放

但是外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数,所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。

闭包的临时变量修改-使用nonlocal关键字

def myClosure():
    closurvar = 10
    def inner(innervar):
        nonlocal closurvar
        closurvar +=innervar
        return  closurvar
    # 返回内部函数的应用
    return inner
c = myClosure()
print(c(1))
print(c(2))
输出结果:
11
13

可以看出每次调用inner的时候使用的closurvar变量其实是一个。

闭包的作用

  1. 实现装饰器
  2. 面向对象
  3. 实现单例模式
posted @ 2019-10-30 21:20  何发奋  阅读(341)  评论(0编辑  收藏  举报