我写了一个 Python 例程,其中有一个错误:false
而不是False
. 但是,在编译时没有发现它。该程序必须运行到此行才能通知错误行为。
为什么会这样?Python解释器/编译器中的什么东西使它如此工作?
你有一些参考吗?
我写了一个 Python 例程,其中有一个错误:false
而不是False
. 但是,在编译时没有发现它。该程序必须运行到此行才能通知错误行为。
为什么会这样?Python解释器/编译器中的什么东西使它如此工作?
你有一些参考吗?
由于 Python 的动态特性,不可能在编译时检测到未定义的名称。只检查语法;如果语法正确,编译器生成字节码,Python 开始执行代码。
在给定的示例中,您将获得对全局名称的引用false
。只有当字节码解释器试图真正访问这个全局名称时,你才会得到一个错误。
为了说明,这里有一个例子。你认为下面的代码执行得好吗?
globals()["snyfr".decode("rot13")] = 17
x = false
实际上确实如此,因为第一行动态生成了一个名为false
.
您可以将此视为解释器对于何时查找名称“懒惰”:它尽可能晚地这样做,因为程序的其他部分可以摆弄其已知变量的字典。
考虑程序
>>> def foo():
... return false
...
>>> def bar():
... global false
... false = False
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
NameError: global name 'false' is not defined
>>> bar()
>>> foo()
False
请注意,第一次调用foo
引发了 a NameError
,因为当时foo
运行 Python 不知道是什么false
。但bar
随后修改了全局范围并false
作为False
.
这种命名空间的混淆允许人们在编写程序时具有极大的灵活性。当然,它还删除了许多限制性更强的语言可以为您检查的内容。