简介:

在家过了个春节快不知道自己是干啥的了:),今天收拾一下心情继续读一下python的源码。这一节打算探究一下Python中列表是如何实现的。

1.Python列表创建

首先来到listobject.c文件找到今天的主角PyListObject,像之前一样将它拆解开来。

typedef struct {PyObject ob_base;  // 在整数节已经介绍过,主要包含引用计数和类型Py_ssize_t ob_size;// 用于指明列表中包含几个元素PyObject **ob_item;Py_ssize_t allocated;
} PyListObject;

这样拆解之后我们会看到ob_item,allocated还不能很好的确定它们代表什么,那么我接着往下看列表是如何新建的,这里找到新建的方法PyList_New:

// 这里为了方便理解我把源码简化了一下
PyObject *
PyList_New(Py_ssize_t size)
{PyListObject *op;if (size < 0) {  // 检查列表元素个数不小于0PyErr_BadInternalCall();return NULL;}if (numfree) {  // 检查是否有缓存可用numfree--;op = free_list[numfree];_Py_NewReference((PyObject *)op);} else {op = PyObject_GC_New(PyListObject, &PyList_Type);if (op == NULL)return NULL;}// 下面就是开辟内存新建一个列表if (size <= 0)op->ob_item = NULL;else {op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));if (op->ob_item == NULL) {  // 内存开辟失败Py_DECREF(op);return PyErr_NoMemory();}}// 下面为ob_size和allocated赋初始值Py_SIZE(op) = size;op->allocated = size;_PyObject_GC_TRACK(op);return (PyObject *) op;
}

这样我们就可以看出allocated跟ob_size一致,ob_item指向列表内存空间。

2.Python列表填充元素

上面新建了列表元素全是NULL,接下来通过PyList_SetItem为列表填充值。

int PyList_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem)
{PyObject **p;if (!PyList_Check(op)) {  // 检查op类型Py_XDECREF(newitem);PyErr_BadInternalCall();return -1;}if (i < 0 || i >= Py_SIZE(op)) {  // 检查索引是否越界Py_XDECREF(newitem);PyErr_SetString(PyExc_IndexError,"list assignment index out of range");return -1;}// 下面对指定元素赋值p = ((PyListObject *)op) -> ob_item + i;Py_XSETREF(*p, newitem);return 0;
}

设置完值必然还会有取值方法PyList_GetItem

PyObject *
PyList_GetItem(PyObject *op, Py_ssize_t i)
{if (!PyList_Check(op)) {PyErr_BadInternalCall();return NULL;}if (i < 0 || i >= Py_SIZE(op)) {if (indexerr == NULL) {indexerr = PyUnicode_FromString("list index out of range");if (indexerr == NULL)return NULL;}PyErr_SetObject(PyExc_IndexError, indexerr);return NULL;}return ((PyListObject *)op) -> ob_item[i];
}

3.图示

下面就针对上述结构做一个简单的图示

从这里不难看出,其实这时候开辟的空间均只包含指针,也能理解了为什么Python中为什么列表是可变类型的。

到这里先简单了解一下Python列表的创建,后面再一一查看对列表的操作。

读Python源码(三)Python列表的表示相关推荐

  1. python源码剖析—— python中的列表对象

    1. PyListObject对象 PyListObject 对象可以有效地支持插入,添加,删除等操作,在 Python 的列表中,无一例外地存放的都是 PyObject 的指针.所以实际上,你可以这 ...

  2. Python源码学习:Python类机制分析-用户自定义类

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一文,分析了Python在启动初始化时,对内置类的一个基本的初始化流程,本文就简析 ...

  3. Python源码学习:Python类机制分析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文主要分析Python中类时如何实现的,在Python中,一切都是对象:任何对象都 ...

  4. Python源码学习:Python函数浅析-函数闭包

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇分析了函数参数的分析后,本文分析函数闭包的实现.函数闭包即函数定义和函数表达式 ...

  5. Python源码学习:Python函数浅析-有参函数

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 继续上一篇无参函数的调用后,本文将分析Python中的有参函数的大致流程,在Pyth ...

  6. python源码剖析—— python中的字节码对象初探

    一.代码对象 每个初学python的人都会认为python是一种解释型语言,这个不能说错.但是python并不是真的对执行的python代码的每一行进行解释,虽然我们有一个所谓的"解释器&q ...

  7. Python源码学习:Python函数浅析-无参函数

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文会大致分析一下Python中的函数机制.在Python中,函数是一个比较重要的类 ...

  8. Python文件用pyinstaller打包成.exe文件后如何获取Python源码(Python文件反编译)

    此文章自己做个学习记录,也希望对跟我有一样困扰的同学一些帮助! 使用到的工具下载链接我都已经附上,点击下面蓝色字体可直接下载: 1.pyinstxtractor.py 2.wxMEDIT 3.在线编译 ...

  9. (含Python源码)Python实现K阶多项式的5种回归算法(regression)

    0.文章结构 为了方便客官根据需要取阅,节约时间,文章目录结构如下: 问题描述 理论部分:五种回归算法 两种Python读取文件的方法 Python实现五种回归算法 使用的工具箱 总结 1.问题描述 ...

  10. Agisoft Metashape 照片高程改正 附python源码

    Agisoft Metashape 照片高程改正 附python源码 文章目录 Agisoft Metashape 照片高程改正 附python源码 前言 一.计算高程改正数 二.python源码 三 ...

最新文章

  1. FPGA实验四——时间基准电路和带使能的多周期计数器
  2. 合并两个有序链表(C++)
  3. css实现元素水平垂直居中
  4. 使用纯索引子查询优化MySQL的分页查询速度
  5. linux批量过去5小时前文件名,Linux批量修改文件名
  6. Win7登录时出现Group policy client 未启动无法登陆问题的解决方法
  7. 如何掌握眼神接触技巧?
  8. SQL Server 通过发布订阅 实现数据库同步
  9. 初识KnockoutJS
  10. Ember之Computed Properties计算属性
  11. html+css+javascript实现乾坤八卦风水罗盘时钟 (免费附源码)
  12. 转:Windows 7 SP1 RC 开始推送 ┆ 特殊补丁KB976932 ┆ 下载
  13. libed2k源码导读:(二)Session接口以及实现分析
  14. 用 matplotlib 绘制 3D 时间序列动态图
  15. 华为p10android版本,华为P10系列什么时候升级安卓8.0?官方给出答案
  16. Android之MVP模式
  17. 6.Oracle-安全管理
  18. 张小龙:微信十年的产品思考
  19. 重磅推荐 | 朱嘉明:元宇宙——创意、思想、意识协作的下一代网络
  20. sublime安装插件失败血的教训

热门文章

  1. outb, outw, outl函数
  2. 被世界开源界评为“awesome” ESP系列模组开源资料整理,各种开发固件,工具,酷炫的开源项目,库文件都有
  3. Matlab使用入门及应用
  4. 一声叹息:国产麒麟系统为何饱受争议?
  5. Facebook 疯狂投资 AR 技术!
  6. 安卓智能语音机器人--AlphaGo?你也可以
  7. [数论 斐波那契] 51nod1355. 斐波那契的最小公倍数
  8. 【java】SSM框架浅薄理解
  9. QT TCP局域网通讯工具 V1.0
  10. Redis笔记基础篇:6分钟看完Redis的八种数据类型