python列表实现_深入Python列表的内部实现

Python 中的列表异常强大年夜,看看它的内部实现机制是怎么样的,必定异常有趣。

下面是一段 Python 脚本,在列表中添加几个整数,然后打印列表。>>> l = []

>>> l.append(1)

>>> l.append(2)

>>> l.append(3)

>>> l

[1, 2, 3]

>>> foreinl:

...   print e

...

1

2

3

可以发明,列表是一个迭代器。

列表对象的 C 说话构造体

Cpython 中的列表实现类似于下面的 C 构造体。ob_item 是指向列表对象的指针数组。allocated 是申请内存的槽的个数。typedef struct {

PyObject_VAR_HEAD

PyObject **ob_item;

Py_ssize_t allocated;

} PyListObject;

列表初始化

看看初始化一个空列表的时刻产生了什么,例如:l = []。

0597e8ad1caa64a883f4d66acbe71b47.pngarguments:sizeofthe list = 0

returns: list object = []

PyListNew:

nbytes = size*sizeofglobalPython object = 0

allocate new list object

allocate list ofpointers (ob_item)ofsizenbytes = 0

clear ob_item

setlist's allocated varto0 = 0 slots

returnlist object

在列表偏移量 1 的地位插入新元素,整数 5:l.insert(1,5),内部调用ins1() 函数。

要分清列表大年夜小和分派的槽大年夜小,这很重要。列表的大年夜小和 len(l) 的大年夜小雷同。分派槽的大年夜小是指已经在内存平分派了的槽空间数。平日分派的槽的大年夜小要大年夜于列表大年夜小,这是为了避免每次列表添加元素的时刻都调用分派内存的函数。下面会具体介绍。

Append 操作

向列表添加一个整数:l.append(1) 时产生了什么?调用了底层的 C 函数 app1()。arguments: list object, new element

returns: 0 if OK, -1 ifnot

推荐阅读

比来进修了一点收集爬虫,并实现了应用Python来爬取知乎的一些功能,这里做一个小的总结。收集爬虫是指经由过程必定的规矩主动的大年夜网上抓取一些信息的法度榜样或脚本。我们知道机械进>>>详细阅读

地址:http://www.17bianji.com/lsqh/35408.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值