看懂 LEGB 与闭包晚绑定:写给初学者与进阶开发者的 Python 作用域实战指南
Python 之所以迷人,在于它总能把复杂机制包裹进简洁语法里:你写下一个 def、一个 lambda、一个列表推导式,代码看起来像自然语言,但解释器背后其实在严格执行一套名字解析和作用域规则。Python 官方执行模型把这件事说得很清楚:名字在代码块中被绑定,使用名字时会按最近的可见作用域逐层解析;找不到会抛 NameError,而在函数作用域里“先引用、后绑定”还会触发 UnboundLocalError。([Python documentation][1])
如果说“默认参数只在定义时求值一次”是 Python 初学者最常踩的坑之一,那么 LEGB 作用域规则 和 闭包里的晚绑定,就是另一组更隐蔽、也更容易在工程里制造诡异 Bug 的核心机制。它们不仅影响 lambda,也影响普通嵌套函数、回调、装饰器、异步任务、事件绑定,乃至你如何理解“函数为什么会记住外层变量”。Python FAQ 甚至专门解释了“为什么循环里定义的一组 lambda 最后返回一样的结果”,因为它们访问的是外层名字,并且是在调用时读取,而不是定义时把值拷贝进去。([Python documentation][2])
这篇文章就来把这件事彻底讲透:什么是 LEGB,闭包到底“捕获”的是什么,为什么下面这段代码输出不是很多人第一眼以为的 [0, 1, 2],以及在真实项目里该如何写
订阅专栏 解锁全文



被折叠的 条评论
为什么被折叠?



