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+中运行。
答案 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