CLOSURE / 03

闭包观察窗

外层函数已经返回,里面的 count 为什么还活着?因为返回的内层函数保存的不是一个过期数字,而是通往那格绑定的“钥匙”。

记住绑定
不是快照
def make_counter(start=0):
    count = start
    def step():
        nonlocal count
        count += 1
        return count
    return step

已经返回的外层调用帧

make_counter(start=0)

函数返回后,普通局部数据会离开视线;被内层函数引用的自由变量则由闭包单元继续保存。

尚无闭包单元创建计数器后,这里会出现 count 的独立绑定。
还没有返回的 step 函数

循环里最隐蔽的闭包坑

闭包在调用时读取自由变量当前绑定的值,并不会自动把“创建那一刻的值”复制一份。循环结束后,多个函数可能都看向同一个最终值。

Local当前函数自己的局部名称
Enclosing由内向外的外层函数名称
Global当前模块的全局名称
Built-in最后才找内置名称
等待调用三个函数创建完以后,再任选一个执行。
nonlocal 的作用:它声明“赋值目标在最近的外层函数作用域”,让 count += 1 改到闭包保存的那格绑定;如果删掉它,赋值会让 count 被判定为当前函数的局部名称,并在读取旧值时触发错误。