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也不會被打印。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章