《Python源碼剖析》閱讀筆記:第四章-list對象

來源:互聯網
上載者:User
第四章-list對象

 list對象定義:
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
list對象是變長對象,所以有變長對象頭
ob_item數組為真正的儲存容器,用來儲存PyObject對象指標。
ob_size表示list長度。
allocated表示list已指派了多少儲存空間。

list的建立分兩步。1. 建立list對象本身。2. 為ob_item分配記憶體。
list的銷毀也分兩步。1. 回收ob_item的記憶體。2. 銷毀list對象本身。
這樣的對象建立和銷毀方案是為對象池(free_lists)服務的。
在建立list階段,Python會查看free_lists中是否有緩衝對象。若有,則直接從free_lists取出。若沒有,則從堆上分配list對象記憶體。
在銷毀list階段,若緩衝list數(num_free_lists)小於最大可緩衝數(MAXFREELISTS ),則將list對象緩衝到free_lists備用。若超過了num_free_lists,則直接釋放對象記憶體。

設定元素操作可以理解為list[i] = obj。

插入元素操作:實質是函數ins1的封裝。ins1函數的關鍵操作是,先通過list_resize(下面細說)調整list長度,然後確定插入點。由於Python list的索引可以為負數(即末尾元素索引為-1),所以索引值小於0時得加上長度得到C數組的索引。接著將插入點後的元素向後搬運,在插入點寫入對象。從此可以看出list就是C裡數組的概念。
list_resize函數:int list_resize(PyListObject *self, Py_ssize_t newsize)
如果allocated / 2 <= newsize <= allocated,則直接把ob_size設定成newsize。如果不在這個範圍內,就按如下方案realloc記憶體:new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
不是很理解為什麼採用這個方案,求指教。

刪除元素操作:實質是函數app1的封裝。app1函數的關鍵操作是,先找到第一個對象的位置,然後通過list_ass_slice函數將刪除點前後的兩段合并。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.