语法错误和运行时错误有什么区别?

Eri*_*iri 6 python syntax runtime dynamic

例如:

def tofloat(i): 
    return flt(i)

def addnums(numlist):
    total = 0
    for i in numlist:
        total += tofloat(i)
    return total

nums = [1 ,2 ,3]
addnums(nums)
Run Code Online (Sandbox Code Playgroud)

flt应该是float,但我很困惑无论是语法错误或运行时错误.

Pau*_* Bu 7

实际上,这是一个运行时错误,因为Python会尝试flt在运行时解析名称(因为它是一种动态语言),并且它不会找到它.当发生这种情况时,Python会产生异常并说它无法找到您正在使用的符号flt,所有这些都在运行时发生.

当解释器发现使用Python语法不具吸引力的东西时,会发生语法错误.例如:Python的语法不能将输入语法识别为有效的Python程序.这可能发生在:

  1. 你忘了:if, def, class等表达式的末尾添加
  2. 你忘了关闭一些括号或括号等.
  3. 当你不遵守python的语法时很多地方:)

在您的示例中,语法没有任何问题.对于解释器,flt(i)是对flt方法的非常有效的调用,如果它确实存在,则必须在范围内在运行时进行检查.因此,口译员不会抱怨并且您的问题的语法是好的.

实际上,这可以被视为比C#,C++等编译语言更不利.这种错误可以在编译时更快地检测到,并且编译器在找到它时会大声尖叫,因此您可以注意到它.

使用动态语言,在调用实际方法之前,您不会注意到这一点.你的程序很简单,所以你可以快速找到它.但是,缺少ofloat是在一个类的子类的子类中的一些遗留框架内,作为属性,在一些其他模块中,等等.这将是苛刻的:)

更新: 如果您了解Python内部的工作原理,Python文档中的执行模型是一个很好的阅读.这将进一步澄清你的疑问,并会给你很多知识:)

希望这可以帮助!

  • 还应该注意,在Python中,语法错误在技术上是运行时错误,因为它在运行时发生.但编译语言并非如此 - 它们区分编译时错误(例如语法错误)和运行时错误(例如空指针错误). (2认同)