假设我在Python中有以下代码:
a = "WelcomeToTheMachine"
if a == "DarkSideOfTheMoon":
awersdfvsdvdcvd
print "done!"
为什么不出现这个错误?它甚至如何编译?在Java或C#中,这将在编译期间被发现。
答案 0 :(得分:7)
Python不是一种编译语言,这就是为什么你的代码不会抛出编译错误的原因。
Python是一种字节码解释语言。从技术上讲,源代码得到了编译"到字节代码,但是如果使用PyPy或Pyston,字节代码就是及时编译(JIT),否则它会逐行解释。
工作流程如下:
您的Python代码 - > 编译器 - > .pyc文件 - > 口译员 - > 您的输出
使用标准的python运行时这是什么意思?基本上所有繁重的工作都发生在运行时,与C或C ++不同,在C或C ++中,其中的源代码在编译时被分析并转换为二进制。
答案 1 :(得分:2)
在“编译”期间,python几乎只检查你的语法。由于globals()['awersdfvsdvdcvd'] = 1
是有效的标识符,因此在该行实际执行之前不会引发任何错误。仅仅因为您使用未定义的名称并不意味着它无法在其他地方定义......例如:
NameError
如果执行带有拼写错误的名称的行,那么文件中的就足以抑制{{1}}。
好的,所以python不能只查找全局语句吗?答案就是“不” - 从模块“foo”,我可以用类似的方式添加模块“bar”的全局变量。并且python无法知道在实际运行之前导入或将导入哪些模块(我也可以在运行时动态导入模块)。
请注意,我提到的为什么Python作为一种语言无法给你一个关于这些事情的警告的大多数原因都涉及到人们疯狂搞砸事情。有许多工具将警告你这些事情(假设你不会做那种愚蠢的事情)。我最喜欢的是pylint
,但几乎任何python linter应该能够警告你未定义的变量。如果你将一个linter挂钩到你的编辑器,大多数时候你可以在实际运行代码之前捕获这些bug。
答案 2 :(得分:2)
因为Python是一种解释型语言。这意味着如果Python的解释器没有到达该行,它就不会产生任何错误。