Python嵌套函数访问外部变量触发UnboundLocalError的原因咨询
问题原因解析
这是Python变量作用域规则导致的差异,核心在于函数定义阶段的变量作用域标记逻辑:
- Python在编译函数代码时,会先扫描整个函数体,判断变量是局部还是非局部:
- 如果函数内部有对变量的赋值操作(比如
ans = 3),就会把该变量标记为当前函数的局部变量,运行时只会在当前函数的局部作用域查找它。 - 如果函数内部只有读取操作,没有赋值,Python会向上查找外层作用域的同名变量。
- 如果函数内部有对变量的赋值操作(比如
第一个报错的代码分析
在traverse函数里,存在ans = 3的赋值语句,所以编译时Python把ans标记为traverse的局部变量。当函数运行到if ans == 2时,局部的ans还没被赋值(赋值逻辑在后面的if True代码块里),因此触发UnboundLocalError——局部变量还未关联值就被访问。
第二个正常运行的代码分析
traverse函数里只有ans == 2的读取操作,没有任何赋值语句。Python编译时会认定ans不是当前函数的局部变量,运行时会向上找到外层a函数里定义的ans = 4,因此能正常执行条件判断,不会报错,最后a函数打印的仍是自身作用域内的ans值4。
内容的提问来源于stack exchange,提问作者Devansh Sharma
相关产品推荐
相关产品推荐

