1. 程式人生 > >Python動態類型簡介

Python動態類型簡介

Python動態類型

C語言中使用變量, 需先聲明其類型, 如int a = 3, 而Python中直接 a = 3就行, 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動態類型簡介