PYTHON源碼之基本對象(int string list dict)(二)

前面分析了python內(nèi)置類型的組成結(jié)構(gòu),今天來具體說說python基本內(nèi)置類型的存儲問題。
先談?wù)刬nt
python內(nèi)部的int分為小整數(shù)和大整數(shù),小整數(shù)[-5,257),大整數(shù)即為其他的一些整數(shù)。
這樣分的理由是一般來說我們編程,循環(huán)呀啥的,小整數(shù)出現(xiàn)的情況比較多,至于為啥是從-5開始到257,這個估計是python作者的經(jīng)驗(yàn)了。
小整數(shù)對象的存儲數(shù)組為:

#define NSMALLNEGINTS 5
#define NSMALLPOSINTS  257
static PyIntObject  * small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

small_ints被高大上的稱之為小整數(shù)“內(nèi)存池”,從python一運(yùn)行,小整數(shù)在內(nèi)存里面的位置就固定了,而且順序也定下來,2在1的后一個,2的后面是3,即-5,-4,-3,-2.....。那么大整數(shù)呢?在python里面定義一個大整數(shù),也不是定義一個就申請一下內(nèi)存,開辟一個空間。大整數(shù)有大整數(shù)的內(nèi)存池:

struct _intblock{
  struct _intblock *next;
  PyIntPbject objects[N_INTOBJECTS];
}

上面只是存儲大整數(shù)的一個塊,很多塊連起來,就成了一個單向鏈表。
假設(shè)系統(tǒng)剛剛開始,我們還只有一個這樣的塊,從感覺上來講,PyIntPbject objects[N_INTOBJECTS];肯定是存放具體對象的地方,也和小整數(shù)一樣連續(xù)存放,一個蘿卜一個坑?來個1億幾萬億怎么辦?所以不是這樣的,在這里python的設(shè)計者用了一個奇妙的方法。


大整數(shù)對象的鏈表形式.png

原來,是拿著數(shù)組的空間當(dāng)鏈表用,ob_type經(jīng)過強(qiáng)制類型轉(zhuǎn)化后充當(dāng)了next指針的作用。
屢一下流程
申請一個整數(shù),比如1000;
取出頭指針(free_list)指向的元素,填充1000,頭指針后移。
刪除一個整數(shù);
把刪除的整數(shù)元素作為頭結(jié)點(diǎn)加入到free_list鏈表當(dāng)中。

string的字符存儲方式和int小整數(shù)的一樣,都是一個指針數(shù)組來指示位置的,但是字符串的不一樣,有inner和非inner的方式,inner方式的“abc”和“abc”的地址是一樣的,非inner方式,其內(nèi)存地址不一樣。

list和dict的和int與string有些不一樣,他們是實(shí)時申請的,但在釋放時,只釋放對象里面動態(tài)內(nèi)存的那一部分(即對象的內(nèi)容),對象本身是沒有被釋放的,把他的地址存在一個數(shù)組中,這個數(shù)組的實(shí)際作為一個棧,若有申請,則往這個數(shù)組里面取棧頂?shù)刂啡缓蟪跏蓟纯伞?/p>

python源碼基本的對象介紹到這里,下一章為pyc與PyCodeObject。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,803評論 1 118
  • ? 1.python的整型對象是PyIntObject對象,這個對象是一個不可變對象,即沒有ob_size這個變量...
    qalangtao閱讀 583評論 0 0
  • 我們在學(xué)習(xí)理解一個事物時,往往遵循著由表及里的規(guī)律。第一步,我們學(xué)習(xí)一個事物的特性表現(xiàn)(feature)。在對事物...
    light_cong閱讀 7,907評論 1 14
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,692評論 18 399
  • 早上,臭果又是千呼萬喚起不來,好不容易拽起來穿完衣服,就剩穿襪子的時候,說憋不住了,跑去尿尿。奶奶跟著進(jìn)了洗手間,...
    我是艾一閱讀 328評論 3 2

友情鏈接更多精彩內(nèi)容