Python嵌套函数变量作用域疑问:res需用self.res而total无需?
问题原因解析
这个问题的核心是Python的变量作用域规则在起作用,具体可以拆成两点来看:
1. 赋值操作决定变量的作用域归属
Python有个关键规则:如果在函数内部对某个变量执行赋值操作(比如res = xxx),Python会默认把这个变量当成当前函数的局部变量,哪怕外层作用域已经有同名变量。
而如果只是读取变量的值(比如用total计算current * (total - current)),Python会按照「局部→嵌套→全局→内置」的顺序往上查找变量,找到外层的同名变量就直接用,不会报错。
2. total和res的使用差异
- total的情况:你代码里的
total应该只是在嵌套函数(比如dfs)里被读取,没有执行赋值操作(比如total = xxx)。所以Python会自动从外层作用域找到你定义的total变量,正常使用,不会有问题。 - res的情况:改成局部变量后,你在嵌套函数里会执行
res = max(res, ...)这样的赋值操作。这时候Python会把res标记为嵌套函数的局部变量,但第一次执行max(res, ...)时,局部的res还没被定义(你是在这行代码里才第一次给它赋值),自然就触发了UnboundLocalError——相当于你在使用一个还没声明的局部变量。
怎么解决?
如果想在嵌套函数里修改外层的局部变量res,只需要在嵌套函数开头加一句nonlocal res,告诉Python:这个res不是当前函数的局部变量,而是来自外层作用域的变量。这样Python就会正确找到外层的res,既可以读取也可以修改,不会再报错。
内容的提问来源于stack exchange,提问作者fatpanda2049
相关产品推荐
相关产品推荐

