首页 > 解决方案 > 为什么在全局范围内消息是“名称未定义”而不是“分配前引用的变量”?

问题描述

一个无法访问的赋值语句在本地范围内创建了一个“已定义但未分配”的名称,但这不适用于全局范围:

#!/usr/bin/python3
#global scope
if False:
 baz = 4
 pass
#Raise "NameError: name 'baz' is not defined"
print(baz)

我希望variable 'baz' referenced before assignment在全局范围内得到类似于在本地范围内的消息,但实际消息name 'baz' is not defined在全局范围内。

我在 Python 3.7.2+ 中运行。

标签: python

解决方案


在函数作用域中,Python 分析所有赋值操作以生成作用域应具有的变量的完整列表。局部变量查找在字节码编译时已知对应于函数主体中对该变量的至少一个实际赋值,因此未绑定局部变量的异常消息提到了赋值。

没有这样的分析发生在全局或类范围内,也没有这样的分析可能是全面的,因为from whatever import *globals().update(stuff)编译时绑定了未知的变量。Python 不会尝试跟踪全局范围“应该”具有哪些变量,也不会尝试区分

print(a)
a = 1

在绑定之前使用变量的位置,以及

print(b)

根本没有绑定操作,或者

thing = 1
print(thinh)

哪里thinh有错字。无论是否有分配,都使用相同的错误消息模板,因此当可能根本没有分配时,模板说“分配前”没有多大意义。


推荐阅读