编程语言
首页 > 编程语言> > Python 闭包 closure

Python 闭包 closure

作者:互联网

1 前置知识点:

# part1
i = 1
def func1():
    print(i)
func1()
# part2
def func2():
    # global i
    print(i)
    i = 2 # 因为有赋值,所以 i 在 func2 中被认为是 local var
func2()
# UnboundLocalError: local variable 'i' referenced before assignment

2 闭包

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。

以下解释源自《流畅的Python》

例子

def make_averager():
    queue = []

    def averager(num):
        # averager.__code__.co_freevars: ('i', 'averager')
        queue.append(num) # 引用了外部非全局变量,queue 里的值可以一直存续
        return sum(queue) / len(queue)

    return averager # 外部函数返回内部函数

3 闭包中的延迟绑定(后期绑定?)

Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.
Python 的闭包是延迟绑定的,闭包中的相对 inner function 的外部变量是在被调用时被加载。(LOAD_COLSURE)

ref: https://docs.python-guide.org/writing/gotchas/#late-binding-closures

4 装饰器

装饰器的实现基于闭包。

def decorator(func_name):
    def handler(*args, **kw):
        # deal with args/kw/return result
        res = func_name(*args, **kw) # func_name 是 handler 的外部非全局变量
        return res
    return handler # 外层函数的返回值是内层函数的引用

标签:闭包,closure,return,函数,Python,queue,local,def
来源: https://www.cnblogs.com/jneeee/p/python_closure.html