You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:01:19