動态類型以及它提供的多态性,無疑是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[:]
此時對當中一個的改動不會影響還有一個。兩個對象在不同的記憶體區域。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNwMjZkFGZ1IGMkJmM2M2Y2kTNxEGZlljZilTY2EjZm9CX2AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.png)
參考<<learning python>>