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 被判定为当前函数的局部名称,并在读取旧值时触发错误。