在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中沒有對類型進行約束,它具備了高度的靈活性。