Python到底是强类型语言,还是弱类型语言?
来源 | Python猫
关于Python到底是 强类型 还是 弱类型 语言,网络上真的是百家争鸣,甚至还有些Python书本都定义错误,导致很多人都理解错误。
今天我们就来深度探讨一下:Python 到底是不是强类型语言?
0、前言
1、动静类型与强弱类型
动态类型
与静态类型
,但是很多人也会把它们跟强弱类型
混为一谈,所以我们有必要先作一下概念上的澄清。"1000"+1
会得到字符串“10001”,而 "1000"-1
则会得到数字 999,也就是说,编译器根据使用场合,对两种不同类型的对象分别做了隐式的类型转化,但是相似的写法,在强类型语言中则会报类型出错。(数字与字符串的转化属于过分的转化,下文会再提到一些合理的转化。)强类型:Java、C#、Python、Ruby、Erlang(再加GO、Rust)…… 弱类型:C、C++、Javascript、Perl、PHP、VB……
2、过去的强弱类型概念
In 1974, Liskov and Zilles defined a strongly-typed language as one in which "whenever an object is passed from a calling function to a called function, its type must be compatible with the type declared in the called function."[3] In 1977, Jackson wrote, "In a strongly typed language each data area will have a distinct type and each process will state its communication requirements in terms of these types."[4]
3、现在的强弱类型概念
Strongly checked language: A language where no forbidden errors can occur at run time (depending on the definition of forbidden error). Weakly checked language: A language that is statically checked but provides no clear guarantee of absence of execution errors.
A weakly typed language has looser typing rules and may produce unpredictable results or may perform implicit type conversion at runtime.
4、Python 是不是强类型语言?
"test"*3
这种字符串“乘法”运算,虽然是两种类型的操作,但是并不涉及隐式类型转换转化。x=10; x="test"
先后给一个变量不同类型的赋值,表面上看 x 的类型变化了,用 type(x) 可以判断出不同,但是,Python 中的类型是跟值绑定的(右值绑定),并不是跟变量绑定的。1 + True
这种数字与布尔类型的加法运算,也没有发生隐式类型转换。因为 Python 中的布尔类型其实是整型的子类,是同一种类型!(如果有疑问,可查阅 PEP-285)__add__()
方法,Python 中一切皆对象,数字对象也有自己的方法。(其它语言可不一定)5、其它相关的问题
123 + null
结果为 123,123 + {}
结果为字符串“123[object Object]”。true==['2']
判断出的结果为 false,而true==['1']
的结果是 true,还有[]==![]
和[undefined]==false
的结果都为 true……6、小结
相关链接
评论