(Python学习4)List对象

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。

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对象。

创建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

时间: 2024-10-11 05:23:13

(Python学习4)List对象的相关文章

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

Python学习之三【对象和类型&amp;amp;&amp;amp;运算符】

[对象和类型] 学生的属性: 小明 对象 姓名:男 性别: 年龄: 身高: 体重: 籍贯: 五种基本对象类型 字符串 (string),简记为 str 使用 ' ' 或 " " 括起来的一系列字符 整数(integer).简记为 int 十进制:21.八进制:025,十六进制:0x15 浮点数(float)1.48.21.0,21...21,2.1E2 布尔数(boolean),简记为 bool   True,False 复数(complex) 对象类型  小明   type('小明

Python学习之三【对象和类型&amp;&amp;运算符】

[对象和类型] 学生的属性: 小明 对象 姓名:男 性别: 年龄: 身高: 体重: 籍贯: 五种基本对象类型 字符串 (string),简记为 str 使用 ' ' 或 " " 括起来的一系列字符 整数(integer),简记为 int 十进制:21,八进制:025,十六进制:0x15 浮点数(float)1.48,21.0,21.,.21,2.1E2 布尔数(boolean),简记为 bool   True,False 复数(complex) 对象类型  小明   type('小明

Python学习-08-面向对象编程进阶和异常处理

一.类的进阶 1)静态方法: 跟类没有关系了.是一个单纯的函数.调用的时候,必须用类名来调用.(台湾与大陆的关系.)相当于类下面的一个函数,跟类没有关系,不能直接调用类的参数. 静态方法:只是名义上归类管理,实际上静态方法访问不了类或实例中的任何属性. 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问

Python学习:自定义对象

一:首先看一段小程序 <span style="font-size:18px;">class person: def __init__(self): print "new person" p = person();</span> 可以看出:python中用关键字class自定义对象,后面加一个冒号 然后需要定义类的构造方法__init_,构造方法中需要传入参数self,这个self相当于java中的this,指向对象自己. 然后p = Per

Python学习-07-面向对象编程初级

一.摘要 1)     类: 属性:实例变量 类变量 私有属性 __var 方法:构造方法:初始化实例 析构方法:实例销毁的时候自动执行的方法. 私有方法 2)     对象:实例化一个类之后得到的对象 3)     封装:把一些功能的实现细节不对外暴露 4)     继承:代码的重用 多继承:Python3中都是广度优先. 5)     多态:接口重用,一个接口,多种实现 二.类和方法(参考http://www.cnblogs.com/alex3714/articles/5188179.htm

Python 学习之文件对象的属性和方法简介

python的文件处理和相关输入输出能力.介绍文件对象(它的内建函数,内建方法和属性),标准文件,同时讨论文件系统的访问方法,文件执行,以及相关文件模块. 一.内建函数open 语法:file_object = open(file_name,access_mode='r',buffering=-1) file_name    要打开的绝对路径或者相对路径文件名 access_mode    处理文件的模式,常规的模式有r.w.a.r+.w+.a+.其中r模式的前提是系统本身存在该文件,读取模式.

Python学习--类和对象

一.几个概念 类:代表对象的集合. 对象:对象包括特性和方法.特性只是作为对象的一部分的变量,方法则是存储在对象内部的函数.所有对象都属于某一个类,称为类的实例. 方法:绑定到对象特性上面的函数称为方法. 封装:指向程序中的其他部分隐藏对象的具体实现细节的原则. 继承:一个类可以使一个或者多个类的子类.子类继承超类的所有方法, 子类:当一个对象所属的类是另外一个对象所属类的子集时,前者就被称为后者的子类,后者就是前者的的超类. 二.类 2.1 创建类 在创建类之前,先说两个概念. 新式类:创建新

python学习之-函数对象

函数对象指的是: 函数的内存地址可以像变量值一样去使用 函数对象的使用 def func():   #定义一个函数 print('from func')   #这是功能 1.函数对象可以被引用 f=func  #将函数地址放到一个变量中 print(f)   #打印这个函数的值,得到的是一个函数的内存地址 f()  #这里变量加上括号,就会得到函数的功能 PS:想要引用一个函数的功能,必须将这个函数的的内存地址放入一个变量,然后再调用这个变量 PS:在函数地址放入变量的时候不能加(),如果加了(

python学习16——函数对象与闭包函数

一 函数对象 函数对象指的是函数可以被当做数据来处理,具体可以分为四个方面的使用,我们如下 1.1 函数可以被引用 >>> def add(x,y): ... return x+y ... >>> func=add >>> func(1,2) 3 1.2?函数可以作为容?类型的元素 >>> dic={'add':add,'max':max} >>> dic {'add': <function add at 0x