Python動態類型簡介

jopen 10年前發布 | 12K 次閱讀 Python Python開發

在python中,類型是在運行過程中自動決定的,而不是通過代碼聲明。這意味著沒有必要事先聲明變量。Python是動態類型的,也是強類型語言(只能對一個對象進行適合該類型的有效的操作)。

 

變量、對象和引用

 

變量在賦值時才創建,它可以引用任何類型的對象,并且必須在引用之前賦值。

>>> a=3

Python將會執行三個不同的步驟去完成這個請求,這些步驟反應了Python語言中所有賦值的操作:

(1)創建一個對象來代表值3;
(2)創建一個變量a,如果它還沒有創建的話。
(3)將變量與新的對象3相連接。

在Python中從變量到對象的連接稱為引用。

變量是一個系統表的元素,擁有指向對象的連接的空間。
對象是分配的一塊內存,有足夠的空間去表示它們所代表的值。
引用是自動形成的從變量到對象的指針。

 

垃圾回收機制


Python在每個對象中保持了一個計數器,計數器記錄了當前只想該對象的引用的數目。一旦這個計數器被設置為零,這個對象的內存空間就會自動回收。垃圾收集最直接的,可高收到的好處就是:這意味著可以在腳本中任意使用對象而不需要考慮釋放內存空間。

共享引用


>>> a=3
>>> b=3
>>> a=“spam”
變量a引用了由常量表達式spam所創建的新的對象,但是變量b仍舊引用原始的對象3,因為這個賦值運算改變的不是對象3,僅僅改變了變量a,變量b并沒有發生改變。
在python中,變量總是一個指向對象的指針,而不是可改變的內存區域的標簽。給一個變量賦一個新的值,并不是替換了原來的對象,而是讓這個變量去完成引用完全不同的一個對象。

共享引用與原處修改


>>> L1 = [2,3,4]
>>> L2 = L1
>>> L1[0] = 24

>>> L1
[24,3,4]
>>> L2
[24,3,4]
在這里,沒有改變L1,而是改變了L1所引用的對象的一個元素。這類修改會覆蓋列表對象中的某部分。因為這個列表對象是與其他對象共享的,那么一個像這樣在原處的改變不僅僅會對L1有影響,而且會影響L2。

>>> L1 = [2,3,4]
>>> L2 = L1[:]
>>> L1[0] = 24

>>> L1
[24,3,4]
>>> L2
[2,3,4]
這里,對L1的修改不會影響L2,因為L2引用的是L1所引用對象的一個拷貝,也就是說,兩個變量指向了不同的內存區域。

共享引用和相等


"=="操作符測試兩個被引用的對象是否有相同的值。
“is操作符“是在檢查對象的同一性。

>>> L1 = [2,3,4]
>>> L2 = [2,3,4]
>>> L1 == L2
True
>>> L1 is L2
False

小的整數和字符串在內存中被緩存并且會被復用。
>>> X = 42
>>> Y = 42
>>> X == Y
True
>>> X is Y
True

總結


動態類型意味著將寫更少的代碼,也是python中多態的根本。python中沒有對類型進行約束,它具備了高度的靈活性。

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!