作家
登录

深入Python列表的内部实现

作者: 来源: 2017-05-24 17:19:01 阅读 我要评论

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

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

  1. >>> l = [] 
  2.  
  3. >>> l.append(1) 
  4.  
  5. >>> l.append(2) 
  6.  
  7. >>> l.append(3) 
  8.  
  9. >>> l 
  10.  
  11. [1, 2, 3] 
  12.  
  13. >>> for e in l: 
  14.  
  15. ...   print e 
  16.  
  17. ... 
  18.  
  19.  
  20.  
  21.  

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

列表对象的 C 说话构造体

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

  1. typedef struct { 
  2.  
  3.     PyObject_VAR_HEAD 
  4.  
  5.     PyObject **ob_item; 
  6.  
  7.     Py_ssize_t allocated; 
  8.  
  9. } PyListObject;  

列表初始化

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

  1. arguments: size of the list = 0 
  2.  
  3. returns: list object = [] 
  4.  
  5. PyListNew: 
  6.  
  7.     nbytes = size * size of global Python object = 0 
  8.  
  9.     allocate new list object 
  10.  
  11.     allocate list of pointers (ob_item) of size nbytes = 0 
  12.  
  13.     clear ob_item 
  14.  
  15.     set list's allocated var to 0 = 0 slots 
  16.  
  17.     return list object  

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

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

Append 操作

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

  1. arguments: list object, new element 
  2.  
  3. returns: 0 if OK, -1 if not
     1/4    1 2 3 4 下一页 尾页

      推荐阅读

      Python爬虫爬取知乎小结

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


    本文标题:深入Python列表的内部实现

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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)