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

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