Python源码学习笔记 4 列表对象

1.PyListObject

[listobject.h]
typedef struct {
    PyObject_VAR_HEAD //其中的obsize记录实际使用内存的对象数量
    PyObject **ob_item; //指向列表存储空间中第一个元素地址
    int allocated;  //一共分配的内存空间对象数量(含未使用),obsize<=allocated
} PyListObject;

2.创建列表对象

首先会对传入的size做检查,其后检查缓冲池是否可用,根据情况创建或服用列表对象。列表对象创建完毕后,根据size大小为元素列表申请合理空间,并初始化。

[listobject.c]
PyObject *
PyList_New(Py_ssize_t size)
{
    PyListObject *op;
    size_t nbytes;
#ifdef SHOW_ALLOC_COUNT
    static int initialized = 0;
    if (!initialized) {
        Py_AtExit(show_alloc);
        initialized = 1;
    }
#endif

    if (size < 0) { //检查size是否为负数
        PyErr_BadInternalCall();
        return NULL;
    }
    if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *)) //检查size的值是否会导致内存溢出
        return PyErr_NoMemory();
    nbytes = size * sizeof(PyObject *);//计算创建元素列表所需的空间大小
    if (numfree) {   //检查list缓冲区是否可用
        numfree--;
        op = free_list[numfree];
        _Py_NewReference((PyObject *)op);
#ifdef SHOW_ALLOC_COUNT
        count_reuse++;
#endif
    } else { //若缓冲区不可用,则需分配新的内存空间
        op = PyObject_GC_New(PyListObject, &PyList_Type);
        if (op == NULL)
            return NULL;
#ifdef SHOW_ALLOC_COUNT
        count_alloc++;
#endif
    }
    if (size <= 0)
        op->ob_item = NULL;
    else {
        op->ob_item = (PyObject **) PyMem_MALLOC(nbytes); //为元素列表申请内存
        if (op->ob_item == NU
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值