1. 经典的误解

一个非常经典的对于 Python 误解就是认为 Python 是一个弱类型语言. 然而, 事实上, Python 是一门强类型语言. 在解释这个结论之前, 我们需要弄清楚什么是强类型语言, 什么是弱类型语言.

强弱类型有很多区分方式, 讨论到现在也没有一个定论. 但是目前公认的一种区分方式为:

  • 如果一门语言很少地进行隐式类型转换, 说明它是强类型语言.

  • 如果一门语言经常地进行隐式类型转换, 说明他是弱类型语言.

按照这个定义, Python 无疑是强类型语言, 因为 Python 几乎不会进行隐式类型转换.

疑问

当 Python 执行 1 + 2.0 并得到 3.0 这个结果时, 难道不是先将 1 隐式转换成 1.0 然后再进行计算的吗?

这是 C 语言的做法, 并不能想当然的认为 Python 也是这么做的. 事实上, 当 Python 执行 a + b 时, 并不关心变量 ab 的类型, Python 只是单纯的将 a + b 解释为 a.__add__(b), 在某些特殊的时候, 也会解释成 b.__radd__(a), 当然, 这个是另一个故事了. 可以看到, Python 在做加法时, 并没有进行类型转换, 而是直接调用变量的成员方法, 在这个过程中, 两个变量的类型都没有发生变化. 从这个意义上来说, Python 的强类型特性比 C 语言还强. 关于 C 语言的隐式类型转换, 可以参考附录中的 C 语言的隐式类型转换.

疑问

a = '1'
a = 1 + 3

在上述代码中, 变量 a 的值先是字符串 '1', 然后又变成了整数 4, 在运行的过程中, 变量的类型发生了变化, 这不正是弱类型语言的表现吗?

变量 a 只是一个指针的名字, 当运行在第一行的时候, 指向的是字符串 '1', 当运行在第二行的时候, 指向的是整数 4, 这个过程中也不存在类型的隐式转换.