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”有可能是字符串拼接,也可能是数字相加,也可能是用户自定义类型重载加号之后的某种操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值