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
相关产品推荐
相关产品推荐

