Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';Python在执行之前不能发现错误吗?_Python - Fatal编程技术网

为什么';Python在执行之前不能发现错误吗?

为什么';Python在执行之前不能发现错误吗?,python,Python,假设我有以下Python代码: a = "WelcomeToTheMachine" if a == "DarkSideOfTheMoon": awersdfvsdvdcvd print "done!" 为什么这个错误不存在呢?它是如何编译的?在Java或C#中,这会在编译过程中被发现。Python不是编译语言,这就是为什么您的代码不会抛出编译错误 Python是一种字节码解释语言。从技术上讲,源代码被“编译”为字节码,但如果使用PyPy或Pyston,则字节码是即时(JIT)编译的,否

假设我有以下Python代码:

a = "WelcomeToTheMachine"
if a == "DarkSideOfTheMoon":
    awersdfvsdvdcvd
print "done!"

为什么这个错误不存在呢?它是如何编译的?在Java或C#中,这会在编译过程中被发现。

Python不是编译语言,这就是为什么您的代码不会抛出编译错误

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

工作流程如下:

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

使用标准python运行时这一切意味着什么?基本上所有的繁重工作都在运行时发生,不像C或C++,在编译时,它的源代码在整个编译过程中被分析和翻译成二进制。p> 在“编译”过程中,python几乎只检查语法。由于
awersdfvsdvdcvd
是一个有效标识符,因此在实际执行该行之前不会引发任何错误。仅仅因为您使用了一个未定义的名称,并不意味着它不能在其他地方定义。。。e、 g:

globals()['awersdfvsdvdcvd'] = 1
如果执行了名称拼写错误的行,则文件前面的部分足以抑制将发生的
namererror

好的,那么python不能也只查找globals语句吗?答案还是“否”——从模块“foo”开始,我可以用类似的方式将其添加到模块“bar”的globals中。python在实际运行之前无法知道导入或将导入哪些模块(我也可以在运行时动态导入模块)



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

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

Here
a=“DarkSideOfTheMoon”
,因此if条件的主体永远不会执行。相关原因是直到执行时才出现错误。您偶然发现的是语法错误和运行时错误之间的区别…我建议使用一个好的IDE,如PyCharm,来帮助您发现此类错误。它有点编译,而实际的语法错误实际上是在编译过程中发现的。只是在Python中,在更静态的语言中,编译阶段的许多事情都是在运行时发生的。PyPy执行JIT,但大多数人不使用PyPy。Python被编译为字节码,因此它实际上预先检查了整个源代码。Python被编译,字节码通常被解释。