動態(tài)類型
C,C++和Java是靜態(tài)編譯型語言,Python屬于動態(tài)類型的語言,類型實在運(yùn)行過程中自動決定的,而不是通過代碼聲明
變量,對象,引用
當(dāng)我們做如下操作時
>>> a = 3
實際分為三個步驟:
- 創(chuàng)建一個對象來代表值3
- 創(chuàng)建一個變量a,如果它還沒有創(chuàng)建的話
- 將變量和新的對象3相連接
變量和對象保存在內(nèi)存中的不同部分,并通過連接相關(guān)聯(lián),變量總是連接到對象,并且絕不會連接到其他變量,但是更大的對象可能連接到其他的對象。
Python中從變量到對象的連接叫引用,以具體的術(shù)語來講:
- 變量是一個系統(tǒng)表的元素,擁有指向?qū)ο蟮倪B接的空間
- 對象是分配的一塊內(nèi)存,有 足夠的空間去表示它們所代表的值
- 引用是自動形成的從變量到對象的指針
從技術(shù)來講,每個對象都有兩個標(biāo)準(zhǔn)的頭部信息:
- 一個類型表示去標(biāo)識這個對象的類型
- 一個引用的計數(shù)器,用來決定是不是回收這個對象
類型屬于對象,而不是變量
>>> a = 3
>>> a = 'Frank'
>>> a = 3.14
變量名沒有類型,類型屬于對象,而不是變量名,我們并沒有改變變量a的類型,只是讓變量引用了不同的類型的對象而已,實際上,python的變量就是在特定的時間引用了一個特定的對象
對象的垃圾收集
>>> x = 42
>>> x = 'Google' #Reclaim 42 now(unless referenced elsewhere)
>>> x = 3.14 #Reclaim 'Google' now
Python中的每一個對象保持了一個引用計數(shù)器,計數(shù)器記錄了當(dāng)前指向該對象的引用的數(shù)目,一旦這個計數(shù)器被設(shè)置為0,這個對象的內(nèi)存空間就會自動回收。
垃圾收集最直接、可感受到的好處就是,這意味著可以在腳本中任意使用對象而不需要考慮釋放內(nèi)存空間,在程序運(yùn)行時,Python將會清理那些不再使用的空間。實際上,與C和C++這樣的底層語言相比,省去了大量的基礎(chǔ)代碼。
共享引用
>>> a = 128
>>> b = a