为什么在全局范围内显示的消息是“未定义名称”,而不是“分配前引用的变量”?

时间:2019-09-22 08:27:33

标签: python

One unreachable assignment statement made one "defined but not assigned" name in local scope,但这不适用于全局范围:

#!/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+中运行。

2 个答案:

答案 0 :(得分:2)

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

由于from whatever import *globals().update(stuff)之类的操作绑定了编译时未知的变量,因此此类分析不会在全局范围或类范围内进行,并且这种分析可能不会是全面的。 Python不会试图跟踪全局范围“应该”具有的变量,并且不会试图区分

print(a)
a = 1

在绑定之前使用变量的地方,

print(b)

根本没有绑定操作的地方,或者

thing = 1
print(thinh)

其中thinh是一个错字。无论是否有分配,都使用相同的错误消息模板,因此,如果根本没有分配,则模板在“分配之前”说“在分配之前”就没有多大意义。

答案 1 :(得分:0)

看到NameError:时,Python尝试使用基于先前定义的变量或函数。如果不定义变量,则会出现此错误。

在代码中,因为仅在声明False时定义变量,Python无法将其全局传递给其余代码。您可以在错误陈述之前定义 baz global。有多种方法可以实现它,但这取决于您的目标。这是一个示例:

baz = 0

if False:
    baz = 4

print(baz)

输出:0

然后为True:

baz = 0

if True:
    baz = 4

print(baz)

输出:4