For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
Python编程开发语言随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,Python编程语言是不是强类型语言。
关于“Python是否属于强类型”话题,在主流观点之外,还存在着不少误解的看法。
一方面的原因有些人混用了强弱类型与动静类型,这有历史的原因,前面已经分析了。
另外还有一个同样重要的原因,即有人把弱类型等同于“完全没有隐式类型转换”了,这种想法并不对。
事实上,强弱类型的概念中包含着部分相对主义的含义,强类型语言中也可能有隐式类型转换。
比如,Rust语言为了实现“内存安全”的设计哲学,设计了很强大的类型系统,但是它里面也有隐式类型转换(自动解引用)。
问题在于:怎么样的隐式类型转换是在合理范围内的?以及,某些表面的隐式类型转换,是否真的是隐式类型转换?
回到Python的例子,我们可以分析几种的用法。
比如,"test"*3这种字符串“乘法”运算,虽然是两种类型的操作,但是并不涉及隐式类型转换转化。
比如,x=10;x="test"先后给一个变量不同类型的赋值,表面上看x的类型变化了,用type(x)可以判断出不同,但是,Python中的类型是跟值绑定的(右值绑定),并不是跟变量绑定的。
变量x准确地说只是变量名,是绑定到实际变量上的一个标签,它没有类型。type(x)判断出的并不是x本身的类型,而是x指向的对象的类型,就像内置函数id(x)算出的也不是x本身的地址,而是实际的对象的地址。
比如,1+True这种数字与布尔类型的加法运算,也没有发生隐式类型转换。因为Python中的布尔类型其实是整型的子类,是同一种类型!
再比如,整数/布尔值与浮点数相加,在Python中也不需要作显式类型转换。但是,它的实现过程其实是用了数字的__add__()方法,Python中一切皆对象,数字对象也有自己的方法。(其它语言可不一定)
也就是说,数字间的算术运算操作,其实是一个函数调用的过程,跟其它语言中的算术运算有着本质的区别。
另外,不同的数字类型虽然在计算机存储层面有很大差异,但在人类眼中,它们是同一种类型(宽泛地分),所以就算发生了隐式类型转换,在逻辑上也是可以接受的。
后,还有一个例子,即Python在if/while之后的真值判断,我之前分析过它的实现原理,它会把其它类型的对象转化成布尔类型的值。
但是,它实际上也只是函数调用的结果(__bool__()和__len__()),是通过计算而得出的合理结果,并不属于隐式的强制类型转换,不在untrappederrors的范畴里。
所以,严格来说,前面5个例子中都没有发生类型转换。浮点数和真值判断的例子,直观上看是发生了类型转换,但它们其实是Python的特性,是可控的、符合预期的、并没有对原有类型造成破坏。
退一步讲,若放宽“隐式类型转换”的含义,认为后两个例子发生了隐式类型转换,但是,它们是通过严谨的函数调用过程实现的,也不会出现forbiddenerrors,所以还是属于强检查类型。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。