python中闭包的概念以及装饰器介绍

一、什么是闭包

  闭包(closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。以上两种解释都太抽象了。还有一种比较容易的理解方式:当一个函数内部嵌套另一个函数,内部函数体用到了外部函数的局部变量,并且外部函数的返回结果是内部函数名(或者说是内部函数对象),这样在执行外部函数时得到的是内部函数对象,此时虽然外部函数已经结束,但接下来继续执行内部函数时,内部函数仍能访问到所引用的外部函数的那个局部变量,也就是说此时外部函数虽然执行完毕,但内存并没有释放,还需等待内部函数执行完毕后才释放内存。这种现象就叫做闭包。

def outer(name):
    def inner(age):
        print("name:", name, "age:", age)  # 内部函数inner调用了外部函数outer的变量name
    return inner   # 结果返回的时inner对象
f = outer("lilei")   # 执行outer函数得到的是inner对象,相当于f = inner
f(18)  # 相当于执行inner(18)
结果:
name: lilei age: 18

 我们可以通过__closure__属性来查看函数是否存在闭包,如果存在,则返回一个cell对象,并且通过cell对象可以查出闭包中所包含的所有外部变量。如果函数不存在闭包,则返回None.

def outer(name):
    def inner(age):
        print("name:", name, "age:", age)  # 内部函数inner调用了外部函数outer的变量name
    return inner   # 结果返回的时inner对象
f = outer("lilei")   # 执行outer函数得到的是inner对象,相当于f = inner
f(18)  # 相当于执行inner(18)
print(f.__closure__)
print(f.__closure__[0].cell_contents)
结果:
name: lilei age: 18
(<cell at 0x02E3EF10: str object at 0x02E4FAA0>,)
lilei
def outer(name,age):
print("name:", name, "age:", age)
outer("lilei",18)
print(outer.__closure__)
结果:
name: lilei age: 18
None


  

猜你喜欢

转载自www.cnblogs.com/feixiangshuoshuo/p/12457852.html