为什么Python在执行之前没有发现错误?

Why doesn't Python spot errors before execution?

假设我在Python中有以下代码:

1
2
3
4
a ="WelcomeToTheMachine"
if a =="DarkSideOfTheMoon":
    awersdfvsdvdcvd
print"done!"

为什么不出错? 它甚至如何编译? 在Java或C#中,这将在编译期间被发现。


Python不是一种编译语言,这就是为什么你的代码不会抛出编译错误的原因。

Python是一种字节码解释语言。从技术上讲,源代码被"编译"为字节代码,但是如果使用PyPy或Pyston,字节代码就是及时编译(JIT),否则它是逐行解释的。

工作流程如下:

您的Python代码 - >编译器 - > .pyc文件 - >解释器 - >您的输出

使用标准的python运行时这是什么意思?基本上所有繁重的工作都在运行时发生,与C或C ++不同,其中完整的源代码在编译时被分析并转换为二进制。


因为Python是一种解释语言。这意味着如果Python的解释器没有到达该行,它将不会产生任何错误。


在"编译"期间,python几乎只检查你的语法。由于awersdfvsdvdcvd是有效的标识符,因此在该行实际执行之前不会引发错误。仅仅因为您使用未定义的名称并不意味着它无法在其他地方定义......例如:

1
globals()['awersdfvsdvdcvd'] = 1

文件中较早的内容足以抑制执行带有拼写错误名称的行时出现的NameError

好吧,所以python不能只查找全局语句吗?答案就是"不" - 从模块"foo",我可以用类似的方式添加模块"bar"的全局变量。并且python无法知道在它实际运行之前导入或将导入哪些模块(我也可以在运行时动态导入模块)。

请注意,我提到的为什么Python作为一种语言为什么不能给你一个关于这些事情的警告的大多数原因涉及人们做疯狂搞砸事情。有很多工具可以警告你这些事情(假设你不会做那种愚蠢的事情)。我最喜欢的是pylint,但几乎任何python linter应该能够警告你未定义的变量。如果您将linter挂钩到编辑器,大多数时候您可以在实际运行代码之前捕获这些错误。