Python 到底是强类型还是弱类型?
强类型观点:
- Python 不进行数据类型隐式转换
弱类型观点:
- Python 变量无需类型声明、变量类型不固化、函数返回值不确定类型
- “abc” * 10 合法
- Python 可以支持类型隐式转换(向上兼容),但不可以固化变量类型(无法向上兼容),因此应该用“不可变的特性”:变量类型固化与否,而非“是否支持隐式类型转换”,作为区分强弱类型语言的特征。
个人观点:
- 当引入动/静态类型的概念——变量类型不固化
- 那么强/弱类型的概念就会缩小到——实例类型不固化(其实实例类型必定固化,只是实例可能会被语言内核认为等价的其它类型的实例替换,也即隐式类型转换)
若 强/弱类型 与 动/静态类型 概念隔离,Python确实可以算强类型,因为Python确实不支持隐式类型转换。
- 变量无需类型声明、变量类型不固化、函数返回值不确定类型,属于动态类型特征。
- “abc” * 10,语义上和过程中都没有涉及类型转换,可以算作运算符重载实现的特定功能。
- 很明显,任何特性从严格到宽松,都是可以向上兼容的;从宽松到严格,都是不可以向上兼容的。比如说,已经支持隐式类型转换的语言,若不再支持,势必也变成了新语言。这样说“是否支持隐式类型转换”也属于“不可变特性”,用“是否支持隐式类型转换”作为区分强弱类型的语言的特征是可以的。
通过第三点可以知道弱类型观点中“不可变特性”的区分方法就是不恰当的,其关键在于特性不可以从宽松到严格。
这同时提醒我们:当“动/静态类型”概念未出现,或者说,当把“强/弱类型”的概念扩展到广义上——类型系统严格与否——那么Python就属于弱类型。
对比JS,JS不仅不固化变量类型,同时还会对数据类型作隐式转换,完全的弱类型无疑。但是对比C、Java,Python无需类型声明、变量类型不固化、函数返回值不确定,甚至还默认带有多类型运算符重载,则Python的类型系统不严格,也属于“弱类型”。