Python编译器为什么会忽略一些错误?

3

我写了一个Python程序,其中有个错误:false而不是False。然而,在编译时并没有发现这个错误。直到运行到这一行代码才通知到错误。

为什么会这样呢?Python解释器/编译器中的哪些因素导致它能够工作?

您有相关参考资料吗?


4
false 是一个有效的变量名,而不是一种语法错误。 - Martijn Pieters
2
在Python 2.7中为了增加一些额外的乐趣,请执行True = 0; False = 1。接下来将会发生一些有趣的事情。 - Tim Pietzcker
2个回答

7
由于Python的动态性,编译时无法检测到未定义的名称。只有语法被检查;如果语法正确,编译器将生成字节码,然后Python开始执行代码。
在给定的示例中,您将获得对全局名称false的引用。只有当字节码解释器尝试实际访问此全局名称时,才会出现错误。
为了说明这一点,这里有一个例子。您认为以下代码是否执行良好?
globals()["snyfr".decode("rot13")] = 17
x = false

实际上确实是这样的,因为第一行代码动态生成了一个名为false的变量。


4
你可以把解释器视为“懒惰”的,它在何时查找名称方面非常“慵懒”:尽可能晚地进行查找,因为程序的其他部分可能会调整它已知变量的字典。考虑以下程序。
>>> 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引发了一个NameError,因为在foo运行时,Python不知道false是什么。但是bar修改了全局范围并将false插入为False的另一个名称。
这种命名空间混淆允许以非常灵活的方式编写程序。当然,它也删除了更严格的语言可以为您检查的许多内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接