Python動態類型簡介
在Python中類型是在運行過程中決定的, 而不是事先聲明的. 像上面Python中運行賦值語句 a = 3, 代碼中沒有說明a是整數對象類型, 但一樣也能工作, 可按如下思路來理解該原由.
變量創建: 一個變量, 就像a, 當代碼第一次給它賦值時就創建了它, 之後的賦值將會改變已創建的變量名的值.
變量類型: 變量永遠不會有任何的和它關聯的類型信息或約束. 類型的概念是存在於對象中而不是變量名中. 變量原本是通用的, 它只是在一個特定的時間點, 簡單地引用了一個特定的對象而已.
變量使用: 當變量出現在表達式中時, 它會馬上被當前引用的對象所代替, 無論這個對象是什麽類型. 此外, 所有的變量必須在其使用前明確的賦值, 使用未賦值的變量會產生錯誤.
動態語言的類型和靜態語言的有明顯不同, 若能清楚的將變量名和對象劃分開來, 動態類型是很容易理解的.
>>> a = 3
從上面的概念來看, Python會執行三個步驟去完成這個操作:
1. 創建一個對象來代表值3.
2. 創建一個變量a, 如果它還沒有創建的話.
3. 將變量與新的對象3相連接.
效果圖如下所示, 變量和對象保存在內存中不同的部分, 並通過連接相關聯.
上面過程, 使用具體的術語來講呢:
· 變量名是一個系統表的元素, 擁有指向對象空間的連接.
· 對象是分配的一塊內存, 有足夠的空間去表示它所代表的值.
· 引用是自動形成的從變量名到對象的指針.
類型屬於對象, 而不是變量
Python中, 變量名沒有類型, 對象才有類型. Python在每個對象上保存了類型標識, 和引用計數. 像下面變量a由引用整數3, 改變為引用字符串'spam'後, 3這個對象會發生什麽變化呢, 進入下一個話題.
>>> a = 3
>>> a = 'spam'
對象的垃圾收集機制
上面說到了, Python在每個對象上保持了一個計數器, 其記錄了指向該對象的引用數目, 一旦計數器被設置為0, 該對象的內存空間就會自動回收.
可以通過sys模塊中的getrefcount函數, 查看對象的引用計數.
>>> import sys
>>> sys.getrefcount('spam')
3
若感興趣可關註訂閱號”數據庫最佳實踐”(DBBestPractice).
Python動態類型簡介