看懂 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],以及在真实项目里该如何写