python 闭包(转)

转自:https://blog.csdn.net/lowerxiaoshen/article/details/78568656

什么是闭包

python中的闭包从表现形式上定义(解释)为: 
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

需要满足的条件:

  1. 一个函数内嵌套一个函数
  2. 外部函数返回值必须是这个内部的函数
  3. 内部函数必须使用外部函数中的局部变量

1.举一个简单的例子

def fun_1():
    num_1 = 9
    def fun_2(num_2):
        print num_1 + num_2

    return fun_2

f = fun_1()   # 现在 f= fun_2
f(8)          # fun_2(8)

输出:
17

这时就称 fun_2 为闭包

2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放

def fun_2():
    a = list()
    def fun(num):
        a.append(num)
        print num
        return a

    return fun

g1 = fun_2()
g2 = g1(2)       
print '*****', g2   
g3 = g1(3)
print '*****', g3

输出:
2
***** [2]
3
***** [2, 3]
  •  

当执行fun_2函数时,变量a被创建。执行g1(2)时,列表a添加一个值2。执行g2(3)时,列表a又添加了一个值。我们知道一个函数内的局部变量的生命周期是从执行函数开始到到结束。而现在我们函数已经执行完了,按道理来讲局部变量a应该清除才对。这就是因为闭包的原因,上面也说了闭包使用了外部函数的局部变量,这就导致局部变量a一直在内存中无法释放, 
占用内存。

总结

闭包最大的特点就是可以将父函数的变量与内部函数绑定,并返回绑定变量的函数(也即闭包),此时即便生成闭包的环境(父函数)已经释放,闭包依然存在,这个过程很像类(父函数)生成实例(闭包),不同的是父函数只在调用时执行,执行完毕后其环境就会释放,而类则在文件执行时创建,一般程序执行完毕后作用域才释放,因此对一些需要重要的功能且不足以定义为类的行为,使用闭包会比使用类占用更少的资源,且更轻巧灵活。

为什么使用闭包?

  • 闭包就是为了不动原函数里面的代码,还要给它增加‘性功能’的一种手段。
  • 通过外面的一层层的函数传递的参数,让最内层的函数可以直接调用外层函数所有参数,从而实现不动原函数的代码,增加新功能的办法。

优点

  1. 闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成

缺点:

扫描二维码关注公众号,回复: 2206399 查看本文章
  1. 由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,占用内存

猜你喜欢

转载自blog.csdn.net/autotest00/article/details/81076285