- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
对象的垃圾收集
答案是,在Python中,每当一个变量名被赋予了一个新的对象,之前的那个对象占用的空间就会被回收(如果它没有被其他的变量名或对象所引用的话)。这种自动回收对象空间的技术叫做垃圾收集。
为了讲清楚,考虑下面的例子,其中每个语句,把变量名x赋值给了不同的对象:
首先注意x每次被设置为不同类型的对象。再者,尽管这并不是真正的情况,效果却是x的类型每次都在改变。在Python中,类型属于对象,而不是变量名。由于变量名只是引用对象而已,这种代码自然行得通。
第二,注意对象的引用值在此过程中逐个丢弃。每一次x被赋值给一个新的对象,Python都回收了对象的空间。例如,当它赋值为字符串'shrubbery'时,对象42马上被回收(假设它没有被其他对象引用):对象的空间自动放入自由内存空间池,等待后来的对象使用。
在内部,Python是这样来实现这一功能的:它在每个对象中保持了一个计数器,计数器记录了当前指向该对象的引用的数目。一旦(并精确在同一时间)这个计数器被设置为零,这个对象的内存空间就会自动回收。在前面的介绍中,假设每次x都被赋值给一个新的对象,而前一个对象的引用计数器变为零,就会导致它的空间被回收。
垃圾收集最直接的、可感受到的好处就是,这意味着可以在脚本中任意使用对象而不需要考虑释放内存空间。在程序运行时,Python将会清理那些不再使用的空间。实际上,与C和C++这样的底层语言相比,省去了大量的基础代码。
注意:从技术上讲,Python的垃圾收集主要基于引用计数器,正如前面所介绍的。然而,它也有一部分功能可以及时地检测并回收带有循环引用的对象。如果你确保自己的代码没有产生循环引用,可以关闭这部分功能,但该功能是默认可用的。
由于引用实现为指针,一个对象有可能会引用自身,或者引用另一个引用了自身的对象。例如,第一部分末尾的练习3及其在附录B中的解答,展示了如何把一个列表的引用嵌入其自身中,从而创建一个循环。对来自用户定义的类的对象的属性赋值的时候,会产生同样的现象。尽管相对很少,由于这样的对象的引用计数器不会清除为0,必须特别对待它们。
要了解Python的循环检测器的更多细节,参见Python库手册中gc模块的文档。还要注意,这里对于Python的垃圾收集器的介绍只适用于标准的Cpython、Jython和IronPython且可能使用不同的方案,尽管直接效果都是类似的,都是未使用的空间又自动重新申请。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论