關于“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__()),是通過計算而得出的合理結果,并不屬于隱式的強制型別轉換,不在 untrapped errors 的范疇里,
所以,嚴格來說,前面 5 個例子中都沒有發生型別轉換, 浮點數和真值判斷的例子,直觀上看是發生了型別轉換,但它們其實是 Python 的特性,是可控的、符合預期的、并沒有對原有型別造成破壞,
退一步講,若放寬“隱式型別轉換”的含義,認為后兩個例子發生了隱式型別轉換,但是,它們是通過嚴謹的函式呼叫程序實作的,也不會出現 forbidden errors,所以還是屬于強檢查型別,
注意:光理論還是不夠的,重點還是要實戰,如果你沒有最新的python入門到實戰教程,可以去小編的Python解答交流群:1148633274 免費領取,相互討論學習
---------本文來源于網路加上自己的見解,如有侵權,請聯系我洗掉!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1958.html
標籤:Python
