Python非局部变量:为何绑定定义作用域却取调用时的值?
Python变量作用域与值解析的时机差异
第一个例子报错的原因
你第一段代码里的otherFcn定义在全局作用域,它的变量查找链条是:自身局部作用域 → 全局作用域。main函数里的x是main的局部变量,不在otherFcn的查找链条里。当调用otherFcn时,全局作用域里并没有定义x,所以触发NameError。这确实说明函数的作用域是在定义时确定的——和调用位置无关,只看定义时所处的层级。
第二个例子输出100的原因
第二段代码里的secFcn是嵌套在main内部定义的,它的作用域链条包含main的局部作用域(这就是闭包的特性)。但要注意:作用域的确定是在定义时,但变量的实际值是在函数调用时才去对应作用域读取的。
secFcn定义时,x的值是24,但在调用secFcn之前,你已经把x重新赋值为100了。当secFcn执行时,它会去main的局部作用域里找当前的x值,也就是100,所以输出"inside secFcn 100"。
核心结论
Python函数的作用域(变量查找的范围)在定义时确定,但变量的实际取值是在调用时才去对应作用域中获取——这就是两个例子看似矛盾的关键。
内容的提问来源于stack exchange,提问作者puddles
相关产品推荐
相关产品推荐

