1. 程式人生 > >python列表的實現

python列表的實現

從資料結構的角度來看,python列表是通過線性表來實現的,進一步來講,是
動態的順序表來實現list的。

那我們就應該首先講一下什麼是動態的順序表?

順序表分為兩類-----一體式順序表和動態的順序表, 動態的順序表指的是表物件和表元素的主體不在一個儲存快中,表物件通過連線的方式與
儲存元素的塊相連。圖示如下:
在這裡插入圖片描述
你要是問我圖片哪裡來的,《資料結構與演算法 python實現》。
怎麼個動態法呢?
就是當表元素的長度超過了元素儲存塊的大小,我們就從新申請一個儲存快,然後將原表
元素複製過去,將表連線指向新的塊,這樣,表的大小可以任意變化,但表物件並沒有
改變!

好了,明白了什麼是動態順序表,再來說一下,list具體是怎麼實現的!

python中的list就是採用了前面敘述的元素儲存區調整策略,調整過程如下:
建立新表時,申請的時一個8個元素的儲存區,在執行插入操作時,如果元素區滿了,就換
一塊4倍的儲存區。但是當表的元素已經滿了,就換一種策略,如當已經滿了5000(官方
數字),那元素儲存區的就加倍,而不是4倍。

還有一點注意的,就是我們既然已經知道了list中的各個元素在物理儲存位置上是順序的,
那麼,在整個過程中所有元素一定是相鄰的,什麼意思呢!就是如果我們在中間刪除一個
元素,pythonlist還能保證每一個元素是相鄰的,也就是,它會重新什麼一塊儲存區,然後
將剩餘的元素依次複製過去。
保證相鄰!!!

舉個例子:

L = [1, 2, 3, 4, 5, 6]
for i in L:
    if i == 3:
        L.remove(3)
        continue
    print(i)
# 1,2,5,6

上面打印出來的只有1,2,5,6.
沒有列印3很正常,因為被刪除了,那為什麼沒有列印4呢?這就是補位的原理了,我們刪除
了3,那麼4就補到了3的位置,但是for迴圈中的指標已經指向的3原來位置(4現在位置)
的下一位,所以4也不會被列印。