(Python学习4)List对象

1、PyListObject对象PyObject_VAR_HEAD中的obsize表示该list对象含有的元素个数,而allocated表示该list对象占用的内存空间。ob_item实际指向一个指

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

1、PyListObject对象

typedef struct {  
    PyObject_VAR_HEAD         
    PyObject **ob_item;  
    Py_ssize_t allocated;  
} PyListObject;  
# 何问起 hovertree.com

PyObject_VAR_HEAD中的obsize表示该list对象含有的元素个数,而allocated表示该list对象占用的内存空间。ob_item实际指向一个指针数组,该数组中的每个指针指向真正的PyObject。

(Python学习4)List对象

 

2、PyListObject对象使用
创建时,可指定大小,据此开辟元素列表所需内存。

op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);  
memset(op->ob_item, 0, nbytes);  
# 何问起 hovertree.com

新建list对象后,可插入、添加、删除元素。若allocated不足,可自动申请内存空间。
Python中list的内存增长模型如下:
0, 4, 8, 16, 25, 35, 46, 58, 72, 88
实现方式为:

new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);  
# 何问起 hovertree.com

删除list对象时

i = Py_SIZE(op);  
while (--i >= 0) {                  // 逐一减小对真实PyObject对象的引用  
    Py_XDECREF(op->ob_item[i]);  
}  
PyMem_FREE(op->ob_item);            // 然后释放元素指针列表  

而该List对象是否销毁,如下。

3、PyListObject对象缓冲池

#define PyList_MAXFREELIST 80  
static PyListObject *free_list[PyList_MAXFREELIST];  

free_list是指针数组,指针指向list对象。
(Python学习4)List对象

 

创建List对象时:

if (numfree) {                             #如果free_list有空闲,直接指向  
    numfree--;  
    op = free_list[numfree];  
    _Py_NewReference((PyObject *)op);  
} else {                                 # 否则新开辟内存空间  
    op = PyObject_GC_New(PyListObject, &PyList_Type);  
}  

删除List对象时:

if (numfree < PyList_MAXFREELIST)        # 如果有空余空间,将list对象放入free_List  
    free_list[numfree++] = op;  
else                                     # 否则直接销毁  
    Py_TYPE(op)->tp_free((PyObject *)op);  

# 何问起 hovertree.com

转自:http://hovertree.com/h/bjaf/pythonlist.htm

推荐:http://www.cnblogs.com/roucheng/p/pythonyunsuan.html

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120546.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月23日 下午11:00
下一篇 2021年12月24日 上午6:00


相关推荐

  • 线程的状态及阻塞

    线程的状态及阻塞之前提到了线程和进程 那就提一下线程的状态吧 线程状态通常分为五种 注意 阻塞被消除后回到就绪状态 不是运行状态温馨提示 大家可以通过 getState 来获取线程当前的状态 NEW RUNNABLE BLOCKED WAITING TIMED WAITING TERMINATED 想要了解更多的线程知识 可以看看我写的上一篇线程与进程

    2026年3月19日
    2
  • python表白代码大全_python好玩又简单的代码

    python表白代码大全_python好玩又简单的代码想要别出心裁给女朋友准备一个惊喜,就用我们所学过的python代码来写一个表白程序。下面我给大家介绍几个。第一树上心形表白:importturtleimportrandomdeflove(x,y):#在(x,y)处画爱心lalalalv=turtle.Turtle()lv.hideturtle()lv.up()lv.goto(x,y)#定位到(x,y)defcurvemove():#画圆弧foriinr

    2026年3月5日
    3
  • gluster源码浅析

    gluster源码浅析gluster的volume是由一系列的translator组成的,translator就像输入输出流的堆栈式结构一样,由一个translator调用另一个translator,每个translator在运行时作为shared-object,根据不同的文件操作调用不同的函数.每个translator一般需要定义xlator_fops、xlator_cbks、init、fini、volume…

    2025年6月8日
    4
  • xml转json工具类_json文件导入数据库

    xml转json工具类_json文件导入数据库点击:http://xmlgrid.appspot.com

    2022年8月22日
    8
  • 系统测试计划模板

    系统测试计划模板系统测试计划 1 前言 1 1 概述本计划定义软件系统测试活动的范围 方法 资源和进度 被测试的对象 被测试的特性 应完成的测试任务 人员职责等 借助测试计划 可以对测试的工作量进行评估 使参与测试的项目成员 尤其是测试管理人员 可以明确测试任务和测试方法 保持测试实施过程的顺畅沟通 跟踪和控制测试进度 应对测试过程中的各种变更 输入测试对象及其目标的简要说明 需要包括该开发项目的历史 主要的功能和性能 测试对象的构架等 说明在开始执行本测试计划之前必须完成的各项工作 说明本计划涵盖的系统测试范围 比如

    2026年3月17日
    2
  • LinkedHashSet类「建议收藏」

    LinkedHashSet类「建议收藏」概述:LinkedHashSet:元素唯一,元素无索引,元素存取有序由哈希表结构保证元素唯一,由链表保证元素存取有序案例:publicclassDemo1{publicstaticvoidmain(String[]args){//1.创建一个LinkedHashSet集合,指定集合中元素的类型为String类型LinkedHashSet&l…

    2022年10月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号