Python|python到底是强类型语言,还是弱类型语言?( 三 )
比如 , x=10; x=\"test\"先后给一个变量不同类型的赋值 , 表面上看 x 的类型变化了 , 用 type(x) 可以判断出不同 , 但是 , Python 中的类型是跟值绑定的(右值绑定) , 并不是跟变量绑定的 。
变量 x 准确地说只是变量名 , 是绑定到实际变量上的一个标签 , 它没有类型 。 type(x) 判断出的并不是 x 本身的类型 , 而是 x 指向的对象的类型 , 就像内置函数 id(x) 算出的也不是 x 本身的地址 , 而是实际的对象的地址 。
比如 , 1 + True这种数字与布尔类型的加法运算 , 也没有发生隐式类型转换 。 因为 Python 中的布尔类型其实是整型的子类 , 是同一种类型!(如果有疑问 , 可查阅 PEP-285)
再比如 , 整数/布尔值与浮点数相加 , 在 Python 中也不需要作显式类型转换 。 但是 , 它的实现过程其实是用了数字的__add__()方法 , Python 中一切皆对象 , 数字对象也有自己的方法 。 (其它语言可不一定)
也就是说 , 数字间的算术运算操作 , 其实是一个函数调用的过程 , 跟其它语言中的算术运算有着本质的区别 。
另外 , 不同的数字类型虽然在计算机存储层面有很大差异 , 但在人类眼中 , 它们是同一种类型(宽泛地分) , 所以就算发生了隐式类型转换 , 在逻辑上也是可以接受的 。
最后 , 还有一个例子 , 即 Python 在 if/while 之后的真值判断 , 我之前分析过它的实现原理 , 它会把其它类型的对象转化成类型的值 。
但是 , 它实际上也只是函数调用的结果(__bool__() 和 __len__()) , 是通过计算而得出的合理结果 , 并不属于隐式的强制类型转换 , 不在 untrapped errors 的范畴里 。
所以 , 严格来说 , 前面 5 个例子中都没有发生类型转换 。 浮点数和真值判断的例子 , 直观上看是发生了类型转换 , 但它们其实是 Python 的特性 , 是可控的、符合预期的、并没有对原有类型造成破坏 。
退一步讲 , 若放宽“隐式类型转换”的含义 , 认为后两个例子发生了隐式类型转换 , 但是 , 它们是通过严谨的函数调用过程实现的 , 也不会出现 forbidden errors , 所以还是属于强检查类型 。
5、其它相关的问题
前文对概念的含义以及 Python 中的表现 , 作了细致的分析 。 接下来 , 为了逻辑与话题的完整性 , 我们还需要回答几个小问题:
(1)能否以“隐式类型转换”作为强弱类型的分类依据?
明确的分类定义应该以《Type Systems》为准 , 它有一套针对不同 error 的分类 , 强弱类型其实是对于 forbidden errors 的处理分类 。 隐式类型转换是其明显的特征 , 但并不是全部 , 也不是唯一的判断依据 。
本文为了方便理解 , 使用这个主要特征来划分强弱类型 , 但是要强调 , 强类型不是没有隐式类型转换 , 而是可能有很少且合理的隐式类型转换 。
(2)假如有其它解释器令 Python 支持广泛的隐式类型转换 , 那 Python 还是强类型语言么?
语言的标准规范就像是法律 , 而解释器是执法者 。 如果有错误的执法解释 , 那法律还是那个法律 , 应该改掉错误的执法行为;如果是法律本身有问题(造成了解释歧义和矛盾 , 或者该废弃) , 那就应该修改法律 , 保证它的确定性(要么是强类型 , 要么是弱类型) 。
(3)为什么说 Javascript 是弱类型?
因为它的隐式类型转换非常多、非常复杂、非常过分!比如 , Javascript 中123 + null结果为 123 , 123 + {结果为字符串“123[object Object
” 。
另外 , 它的双等号“==”除了有基本的比较操作 , 还可能发生多重的隐式类型转换 , 例如true==['2'
判断出的结果为 false , 而true==['1'
的结果是 true , 还有[
==![
和[undefined
==false的结果都为 true……
(4)C++ 是不是弱类型语言?
- 美团|大量外卖小哥退出美团,商家也接连退出,今年到底怎么了?
- 秋叶云裳|对话导演林魂:王思聪力推的动画《雾山五行》到底有何与众不同?
- 哥哥环游记|姜子牙生活到底有多惨?,历史上有一位神人却养不起家庭?
- Java|马化腾登顶中国首富,微信、QQ却都免费使用,腾讯到底咋赚钱的?
- 科学家|龙到底存不存在?科学家已经发现,地球上存在“与龙相似”的生物
- 卫星|以前用的“卫星锅”,它到底能看到些什么?怪不得要禁止使用
- 小绿叶子科技|iPhone到底怎么了!为何卖不动真正原因被确认!
- 选择遗忘|让华为稳了的“云手机”到底是怎么回事?
- 空枝|买了NFC读卡器,到底值不值,为了省门禁卡的钱
- 新陈代谢|人类37度历史体温已回不去了?体温呈下降趋势,到底意味着什么