天天看點

Python<9>動态類型簡介

動态類型以及它提供的多态性,無疑是Python語言簡潔性和靈活性的基礎。

一、變量

<1>變量建立

一個變量a,當代碼第一次給它指派時就建立了它,之後的指派将會改變已建立的變量名的值。

<2>變量類型

變量永遠不會有任何的和它關聯的類型資訊或限制。變量原本是通用的,它隻是在一個特定的時間點,簡單的引用了

一下特定的對象而已。

<3>變量使用

當變量出現在表達式中,它會馬上被目前引用的對象所替代(對象是有類型的)。此外所有的變量必須在使用前明确的

指派,使用未指派的變量會發生錯誤。

總而言之,變量在指派時才建立,它可以引用任何類型的對象,并且必須在引用前指派。

例如  a = 3

會經曆三個步驟:

<1>建立一個對象來代表值3

<2>建立一個變量a

<3>将變量與新的對象相連接配接

是以可得

對象是配置設定的一塊記憶體,有足夠的空間去表示它們所代表的值。

變量是一個系統表的元素,擁有指向對象的連接配接的空間。

引用是自動形成的從變量到對象的指針。

二、類型屬于對象,而不是變量

對一個變量多次指派得,

>>> a = 3

>>> a = ‘hello‘

>>> a = 3.1415

由此可見變量名是沒有類型的,而類型是屬于對象的。我們對a的修改隻是讓它成為不同對象的引用。對象是有類型

的,整數對象3包含值3以及一個頭部資訊,告訴python這是一個整數類型。

三、對象的垃圾收集

在python中,當一個變量名被賦予一個新的對象,之前的那個對象占用的空間就會被回收(如果它沒有被其他變量引

用),稱為垃圾收集。

在内部python是這樣來實作這一功能的:

它在每個對象中保持了一個計數器,記錄了目前指向該對象的引用的數目,一旦這個計數器的值為0,這個對象的内

存空間會自動回收。這意味着不需要考慮記憶體釋放等問題,省去大量的基礎代碼。

四、共享引用

例:

>>> b = a

此時a,b都成為對象3的一個引用,叫做共享引用。

當a改變時,這時不會改變b的值,隻是a修改為‘hello‘的引用而已。

給變量賦一個新的值,不是替換了原始的變量,而是讓這個變量去引用完全不同的另一個對象,效果就像重新指派一

樣,僅僅會影響被指派的變量。

五、共享引用和原處修改

有一些對象和操作确實會在原處改變對象,例如之前寫過的"Python<1>list",進行一些操作時不是生成一個新的對

象,而是直接修改了自身引用的對象,此時共享引用需要加倍小心。如果你不想要這樣的現象發生,需要python拷貝

對象,而不是建立引用。最常見的辦法就是從頭到尾的分片。

>>> L1 = L2[:]

此時對其中一個的修改不會影響另一個,兩個對象在不同的記憶體區域。

參考<<learning python>>