Python之闭包

Python之闭包

 

我们知道,在装饰器中,可以在函数体内创建另外一个函数,例如:

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makebold
@makeitalic
def hello():
    return "hello world"

print hello() 

内部函数的特点在于其整个函数体都在外部函数的作用域之内,除了在函数体内,任何地方都不能对其进行调用。

如果内部函数的定义包括了在外部函数里定义的对象的引用,内部函数会变成闭包。

闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

 

闭包的一个例子:

def counter(start_at=0):
    count = [start_at]
    
    def incr():
        count[0] += 1
        return count[0]

    return incr


cnt = counter(5)
print(cnt())    #6
print(cnt())    #7
print(cnt())    #8

这里,incr是内部函数,它引用了外部作用域(但不是在全局作用域)的变量count,那么这个内部函数就被认为是闭包,而count就是自由变量,它定义在外部函数,但由内部函数使用。

闭包更适合需要一个必须有自己的作用域(既不是局部作用域、也不是全局作用域)的回调函数情况,尤其是回调函数是很小巧而且简单的。

 

posted @ 2015-01-09 17:56  如果的事  阅读(249)  评论(0编辑  收藏  举报