这样理解 Python 闭包

August 23, 2016
Python closure

看了 12 步轻松搞定 python 装饰器 里的描述后,对『closure 是上下文』有了些形象的理解,一些应用了 closure 的实践可以参考文章里的一些例子,例如函数参数定制生成,装饰器功能等


g_var = 20

def outer():
    loc_var = 30
    def inner():
        print('I can access g_var: %s, loc_var: %s' % (g_var, loc_var))
    return inner

in_fun = outer()

# 内层使用到的[外层函数的本地变量]会加入到 func 对象的 __closure__ tuple 里面
print(in_fun.__closure__)

# 全局变量不包含在 closure tuple,并不是副本
g_var = 5000

# 效果就是 in_fun 本身函数内的代码,加上 __closure__ 里的上下文副本实现了 closure 功能
in_fun()

# 也就是说 __closure__ tuple 包含一个 cell 元素,cell 装有外层的 loc_var,值是 30
print('There is %d cell inside' % len(in_fun.__closure__))
print('This cell contain %d' % in_fun.__closure__[0].cell_contents)


comments powered by Disqus