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

Python嵌套函数变量作用域疑问:为何部分代码报错?

问题解析:闭包中的变量作用域问题

先明确你给出的三个代码场景:

可正常运行的代码1

def mom_func():
    temp = 0

    def son_func() :
        a = temp

运行报错的代码2

def mom_func():
    temp = 0

    def son_func() :
        a = temp
        temp = 1

报错信息:Unresolved reference 'temp'

可正常运行的代码3

def mom_func():
    temp = 0

    def son_func() :
        a = temp
        print(a)

    son_func()

核心原因:Python的变量绑定规则

Python处理函数内的变量时,会先扫描整个函数体,判断变量是局部变量还是非局部变量:

  • 如果函数内部对某个变量有赋值操作(比如代码2里的temp = 1),Python会默认这个变量是当前函数的局部变量,不再去外层作用域查找。
  • 如果函数内部只有读取操作(比如代码1和3里的a = temp),Python会依次去外层嵌套作用域、全局作用域查找这个变量。

对应到你的案例:

  • 代码1和3中,son_func只读取temp,没有赋值操作,所以Python会去外层的mom_func作用域找到已定义的temp = 0,因此能正常运行。
  • 代码2中,son_func里存在temp = 1的赋值,Python直接判定temp是son_func的局部变量。但执行a = temp时,局部的temp还未被定义(赋值语句在后面),所以抛出“未解析的引用”错误。

如果你想在闭包里修改外层变量

可以用nonlocal关键字声明temp不是当前函数的局部变量,强制Python去外层嵌套作用域查找:

def mom_func():
    temp = 0

    def son_func() :
        nonlocal temp
        a = temp
        temp = 1

    son_func()

这样读取和赋值操作都能正常作用于外层的temp变量。

内容的提问来源于stack exchange,提问作者JaeEun Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:07