首页 > python动态类型是如何实现的_Python 的动态类型系统

python动态类型是如何实现的_Python 的动态类型系统

Python 与 ABC 的一个重要区别在于其类型系统。

ABC 采用静态类型,编译器会检查程序中的变量类型是否保持一致,如果不一致,程序就无法运行。并且,ABC与当时大多数静态语言不同,采用的是类型推导(和 Haskell 一样),而不是类型声明(比如 C 语言)。而 Python 采用动态类型,所有类型检查都是在程序运行过程中,而不是编译时进行的。

不过,Python 的类型系统与 ABC 也没有大家所想的那么大的区别。

与其它静态语言不同,ABC 除了在编译时进行类型检查,在运行时还会再次检查。在ABC的原型中,并没有实现完整的编译时类型检查,于是,运行时类型检查可以作为一种验证方式。同时,运行时类型检查可以抛出清楚的异常信息,对debug也很有帮助,否则,语言内核可能会因为一些类型错误直接崩溃。

ABC 采用运行时类型检查的最主要的原因,在于它是一种交互式语言。

在交互式场景中,用户输入的每一句代码,都是立即执行的,因此,完全有可能创建一个数字变量,删除它,又创建一个同名的字符串变量。如果这样的赋值过程出现在同一段代码中,显然是无法编译通过的,但在交互式场景中,禁止这种操作也不合理。作为妥协,ABC 对全局变量采用动态类型检查,而局部变量采用静态类型检查——为了简化实现,干脆所有变量都在运行时再次检查。

因此,实际上 Python 的类型检查系统实现得很简单——只是完全抛开 ABC 的编译时类型检查而已。这很符合 Python 的“抄近道”哲学,因为所有的类型错误都在执行前检查过了,所以这个简单的实现完全不影响程序的可靠性。

不过,一旦采用动态类型系统,就和静态类型彻底告别了。

在 ABC 中,精心设计的内置操作可以根据输入内容的具体形式来推断其类型(译注:ABC采用类型推导而不是类型声明),比如说,根据“x^y”,编译器可以推断,x 和 y 都是字符串,这个操作的结果也一定是字符串。而在 Python 中则没法做这样的推断,比如“x + y”有可能是字符串拼接,也可能是数字相加,也可能是用户自定义类型重载加号之后的某种操作。

个人公众号:ReadingPython

博客地址:读书录​blog.kantli.com

更多相关:

  • python是计算机二级考试的科目之一,并没有级别的划分。其考试目标是测试考生掌握Python语言知识的程度和对Python语言的编程能力、调试能力和综合应用能力,在当下的应用中是十分重要的。 什么是python Python语言是一种解释运行、面向对象、扩展性强的程序设计语言,是大学生学习计算机编程能力、理解计算机解决问题的方法的...

  • 正在学C,书上老说空指针,或者说void指针,对于我这样的生手来说,理解非常容易造成混淆,因为void这个单词的意思也是空,到底空指针的意思是指指向地址为空的类型呢,还是指void类型的指针呢 (1)空指针所对应的是指指向的对象为空的指针。            不经发问,什么叫指向为空呢?要理解这点,必须理解如下几点(有点啰嗦,但...

  • 一、reponseType 1、什么是reponseType XMLHttpRequest.reponseType属性是一个枚举类型的属性,返回响应数据的类型,他允许我们手动的设置 返回数据的类型。如果我们将它设置为一个空字符串,它将默认的使用"text"类型。 当将reponseType设置为一个特定的类型的时候需要确保服务...

  • SNMP中,数据类型并不多。这里我们就讨论这些数据类型,而不关心这些数据类型在实际中是如何编码的。INTEGER一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值(例如,IP的转发标志就只有允许转发时的或者不允许转发时的这两种),有些整型变量定义一个特定的范围(例如,UDP和TCP的端口号...

  • 用DBCA创建数据库时回去检查当前的tnsnames.ora文件如果该文件有问题的话 怎创建失败可以使用netmgr来检查 选定local选项。点击service names 如果不能弹出下拉框 则证明有问题 转载于:https://blog.51cto.com/johnnyfox/1353397...