- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【麦子学院】Python 常见内置对象详解
IT 在线教育平台———麦子学院:
【麦子学院】Python 常见内置对象详解
Python 语言中,所有的东西都是对象,因此对于 python 初学者来说,搞清楚 python
对象的具体实现非常重要。
Python 中的对象主要分为类型对象和实例对象,但也不排除有同时属于类型和实例的
对象,而不管是什么对象,除了内置的类型对象外,都存在于堆上,内置的类型对象则静
态分配内存。下面我们就一起来看看 python 常见的内置对象及其实现方法吧。
1、int
int 这个对象比较简单,但还是需要重点了解,以便高效的实现。python 首先有小整
数对象。默认在[-5, 257)。如果超出范围则使用通用的缓冲池,对于大整数则有
PyIntBlock ,用来作缓冲池。一个block 大小大概为 1000 个字节,去掉头部(8 字节),
可以存 82 个整数对象。block 之间通过指针相连,首指针为 block_list ,free_list 则维护着
一条可以链表,free_list 链表的下一项由未用的 PyIntObject 的ob_type 来维持。
如果没有缓冲池可用的时候怎么办呢?这个时候 python 会调用 fill_free_list 来创建一
个新的 block ,并将其插入block_list ,再把free_list 指向这个 block 的objects 中的最后一
个元素。当某个 block 中的某个 int 被释放时,它将自己的 ob_type 指向 free_list ,并修改
free_list 等于它的地址,其实就是一个头部插入,这样把多个 block 间的objects 数组联系
起来防止出现内存泄漏。但值得注意的是小整数对象池其实也是生活在 block 里面,在是
整个 python 环境初始化的时候生成。因此,为 int 分配的内存是永远也不会被 python 释
放的,所有的 int 对象使用的内存大小和同时存在的 int 数量的最大值有关。
2、string
String 为变长对象,主要用于对变长对象内存的管理,每个 string 对象除了头部外还
保存了 hash 值(ob_shash ,避免重复计算,初始-1 )、是否已经被intern 机制处理过
(ob_sstate )、指向实际内存的指针(ob_sval) ,ob_sval 指向的应该是一段 ob_size+1 长
度的内存(为了兼容 C ,字符串要以\0结尾)。在从 char *创建 string 时还是比较直接的,
就是检查一些边界情况、初始化 hash 等,最后逐个拷贝 char。python 中有一个 nullstring
指向空字符串,通过 intern 机制共享,所以不会同时存在多个空字符串。对单个的 char ,
python 也会维持一个缓冲池。创建单个 char 的string 时,如果缓冲池里已有,则直接返
回。如果没有,根据char 创建 string ,再对它进行intern ,再存入缓冲池。
对于已经被创建的 string ,python 会维持一个 string 用来保存,如果新创建 string 已
经在这个 dict ,也就是已经被intern 机制处理过了,那么就会直接返回 dict 中的值。一般
两个相同的字符串的 id 是相同的。要注意的是,无论字符串有没有存在于这个 dict 中,
IT 在线教育平台———麦子学院:
python 都会创建一个新要 string ,原因是因为保存在dict 中只能是PyObject ,因此肯定要
创建一个 python 对象。intern 后的 string 有两种状态,mortal 和 immortal ,区别在于后者
永远不会被 gc 回收。但创建string 时使用的是 PyObject_Malloc 开头的分配函数,一般来
讲它不会每次都从 os 分配内存,而是从 python 维持的一个内存池中分配。
3、list
list 不仅是变长对象,还是可变对象。在变长头部之外 PyListObject 还保存了一个
PyObject **ob_item 指针,一个 int allocated。ob_item 就是指向实际成员的指针,
allocated 代表了 list 当前申请的内存能装多少个 PyObject ,变长头内的ob_size 则代表 list
中已有多少个PyObject。当创建一个 list 时,需要指定 list 的大小(参数size ),要申请的
文档评论(0)