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
博客:http://blog.kantli.com/theme/1

你可能感兴趣的:(Python 的动态类型系统)