数据结构-----顺序表

数据结构

列表数据结构存储

从数据的基本存储知,在内存中一个对象的存储由4字节的存储地址和对象本身决定的,那么一个列表在内存中是如何存储的呢,列表本身又是一个对象,为什么lis[0],lis[1],lis[2]分别就能找到对应的存储数值呢?在列表的存储对象,
这里写图片描述
由上图可知,在对象类表列表本身地址是连续的,而且间隔就是存储一个地址,就想生活中买鞋部的柜台一样,鞋与鞋的位置是连续的,但是鞋的位置可以放置不同品牌的鞋,第一次寻找lis[0]时,在列表lis中无需偏移第二次lis[1]时,因为每个地址占4个字节,因此偏移4个字节即可达到第二个数值。
另外列表中对象本身也是有一个存储地址的,列表中存储的本身就是对象的地址,可通过如下实验证明:

[python@centos7 325]$cat 1.py 
#!/bin/python3
#-*- coding: UTF-8 -*-
lis = [0,1,2,[3,4]]
print(id(lis))
print(id(lis[0]))
print(id(lis[1]))
print(id(lis[2]))
print(id(lis[3]))
print(id(lis[3][0]))
print(id(lis[3][1]))

执行结果如下:

[python@centos7 325]$./1.py 
140446888318920
9181952
9181984
9182016
140446888319112
9182048
9182080

由此可知列表在内存中具体操作了,如向列表中添加数据,需要系统在内存中重新申请资源,而且不一定连续,数据内容放置好后将地址更新至列表对象之中

python列表实现

在python的官方实现中,list就是一种采用分离技术实现的动态顺序表,这就是为什么用list.append(x)或者list.insert(len(list),x 尾部插入) 比在指定位置插入元素的效率高的原因。
在python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阈值为50000),则改变策略,采用加1倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值