【麦子学院】Python 常见内置对象详解.pdf

【麦子学院】Python 常见内置对象详解.pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【麦子学院】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)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档