1 整数对象PyIntObject

整数对象是固定大小的Python对象,内部只有一个ob_ival保存实际的整数值。

typedef struct {

PyObject_HEAD

long ob_ival;

} PyIntObject;

2 字符串对象PyStringObject

Python的字符串对象是一个不可变对象,任何改变字符串字面值的操作都是重新创建一个新的字符串。

字符串对象在Python中用PyStringObject表示,扩展定义后如下:

typedef struct {

Py_ssize_t ob_refcnt;//引用计数

struct _typeobject*ob_type; //类型指针

Py_ssize_t ob_size;//字符串的长度,不计算C语言中的结尾NULL

long ob_shash;// 字符串的hash值,没有计算则为-1int ob_sstate;//字符串对象的状态: 是否interned等

char ob_sval[1]; //保存字符串的内存,默认先分配1个字符,用来保存额外的末尾NULL值/*Invariants:* ob_sval contains space for 'ob_size+1'elements.* ob_sval[ob_size] ==0.* ob_shash is the hash of the string or -1 if notcomputed yet.* ob_sstate != 0 iff the string object is in stringobject.c's

* 'interned' dictionary; inthis case the two references* from 'interned' to this object are *not counted* inob_refcnt.*/} PyStringObject;

3 列表对象PyListObject;

typedef struct {

PyObject_VAR_HEAD#ob_item是用来保存元素的指针数组

PyObject **ob_item;#allocated是ob_item预先分配的内存总容量

Py_ssize_t allocated;

} PyListObject;

4 字典对象PyDictObject

在Python中,字典是通过哈希表实现的。也就是说,字典是一个数组,而数组的索引是键经过哈希函数处理后得到的。哈希函数的目的是使键均匀地分布在数组中。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。

以下基于C语言的数据结构用于存储字典的键/值对(也称作 entry),存储内容有哈希值,键和值。PyObject 是 Python 对象的一个基类。

typedef struct {

Py_ssize_t me_hash;

PyObject*me_key;

PyObject*me_value

} PyDictEntry;

下面为字典对应的数据结构。其中,ma_fill为活动槽以及哑槽(dummy slot)的总数。当一个活动槽中的键/值对被删除后,该槽则被标记为哑槽。ma_used为活动槽的总数。ma_mask值为数组的长度减 1 ,用于计算槽的索引。ma_table为数组本身,ma_smalltable为长度为 8 的初始数组。

typedef struct _dictobject PyDictObject;

struct _dictobject {

PyObject_HEAD

Py_ssize_t ma_fill;

Py_ssize_t ma_used;

Py_ssize_t ma_mask;

PyDictEntry*ma_table;

PyDictEntry*(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash);

PyDictEntry ma_smalltable[PyDict_MINSIZE];

};

5 集合对象PySetObject

set与List对象相似,均为可变异构容器。但是其实现却和Dict类似,均为哈希表。具体的数据结构代码如下。

typedef struct {

long hash;/* cached hash code for the entry key */PyObject*key;

} setentry;/*This data structureis shared by set andfrozenset objects.*/typedef struct _setobject PySetObject;

struct _setobject {

PyObject_HEAD

Py_ssize_t fill;/* #Active + # Dummy */

Py_ssize_t used; /* #Active */

/* The table contains mask + 1 slots, and that's a power of 2.

* We store the mask instead of the size because the mask ismore*frequently needed.*/Py_ssize_t mask;/* table points to smalltable for small tables, elseto* additional malloc'ed memory. table is never NULL! This rule

* saves repeated runtime null-tests.*/setentry*table;

setentry*(*lookup)(PySetObject *so, PyObject *key, long hash);

setentry smalltable[PySet_MINSIZE];

long hash;/* only used by frozenset objects */PyObject*weakreflist; /* List of weak references */};

setentry是哈希表中的元素,记录插入元素的哈希值以及对应的Python对象。

PySetObject是哈希表的具体结构:

fill 被填充的键的个数,包括Active和dummy,稍后解释具体意思

used 被填充的键中有效的个数,即集合中的元素个数

mask 哈希表的长度的掩码,数值为容量值减一

table 存放元素的数组的指针

smalltable 默认的存放元素的数组

当元素较少时,所有元素只存放在smalltable数组中,此时table指向smalltable。当元素增多,会从新分配内存存放所有的元素,此时smalltable没有用,table指向新分配的内存。

参考:

python中常见的流程结构-python常见对象的结构相关推荐

  1. python中数据分析的流程为-python数据分析011_数据分析流程

    一.确定分析目标 1.数据分析的大忌是不知道分析方向和目的,拿着一堆数据不知所措.一切数据分析都是以业务为核心目的,而不是以数据为目的.所以,我们应该先定分析的目标,然后在处理数据. 二.处理数据 1 ...

  2. python中with是什么意思,Python中With的用法

    在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...

  3. python中一共有多少个关键字-Python中关键字有多少个?

    Python中关键词有多少个?Python中关键词目前有31个,可以利用Python的内置的keyword模块进行输出查看. keyword模块Help on module keyword: NAME ...

  4. python中一共有多少个关键字-Python中有几个关键字

    Python中关键词有多少个?Python中关键词目前有31个,可以利用Python的内置的keyword模块进行输出查看. keyword模块 Help on module keyword: NAM ...

  5. python中一共有多少个关键字-Python中所有的关键字

    在python中若想查询python中有哪些关键字可以先导入keyword模块 import keyword #导入关键字模块 print(keyword.kwlist) #查询所有关键字 查询结果: ...

  6. linux 移除python_第16 p,PYthon中的用户交互,Python GUI编程

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第16篇文章,第二阶段的课程:Python基础知识:PYthon中的用户交互.Python GUI编程实现方式介绍. 学习本课程,建 ...

  7. float在python_如何在python中读取.float文件? - python

    Improve this question 我正在处理大脑MRI数据,它是.float数据. 您知道如何在python中使用它吗? 与 with open('[43x25520].float') as ...

  8. 如何在Python中获取图片分辨率?——Python实现获取图片分辨率的代码及详解。

    如何在Python中获取图片分辨率?--Python实现获取图片分辨率的代码及详解. 在进行图片处理或者图片分析的时候,获取图片的分辨率信息是必不可少的.Python提供了许多库可以方便地获取图片的分 ...

  9. python 定义函数方法,python中函数如何定义?python函数的调用方法介绍

    本篇文章给大家带来的内容是关于python中函数如何定义?python函数的调用方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 函数的概念,函数是将具有独立功能的代码块 ...

  10. Python 中的 repr (关键词:Python/repr)

    描述 函数str() 用于将值转化为适于人阅读的形式, repr() 函数将对象转化为供解释器读取的形式. repr()函数得到的字符串通常可以用来重新获得该对象,repr()的输入对python比较 ...

最新文章

  1. Resource entery xx is already defined
  2. 百度智能云一口气发布 14 个新产品,三大视频解决方案,产品最高降价 50%
  3. @RequestParam @PathVariable
  4. boost::graph模块实现bellman算法的测试程序
  5. sql server 2008学习9 视图
  6. 卡牌特效: svg不规则倒计时动效
  7. pandas的DataFrame转化为Datatable的DataFrame
  8. oracle将把varchar2字段(长度4000)改为clob类型
  9. 立即更新 Chrome 浏览器!这个 0day 已遭在野利用
  10. 计算机1级b知识点,初中信息技术等级考试知识点
  11. html批量打印保存到pdf,批量打印成PDF时不用每次点击保存位置的技巧
  12. Snipaste下载安装(使用教程)
  13. 单行文本溢出隐藏显示省略号
  14. 办公小技巧:excel重复项怎么找出来?
  15. 10分钟让你彻底理解如何配置子域名来部署多个项目
  16. [UE4]Steam联机设置
  17. 如何修改Hosts文件(Windows、Linux)
  18. 语法7:assert - 断言
  19. 方唯上传程序后不能登录后台
  20. 智能电子表格,为你轻松制作财务报表

热门文章

  1. 认识Backbone (四)
  2. 两个for还是一个for?
  3. Python环境安装与配置
  4. SharePoint 状态机工作流解决方案(一):为什么要用状态机
  5. LruCache缓存机制
  6. 【leetcode】Jump Game I, II 跳跃游戏一和二
  7. SSL 1052——开心的金明
  8. UIView上的控件使用push方法跳转
  9. cocos2d-x CCParticleSystem粒子系统
  10. 怎么学python-如何高效学 Python?