Python 的垃圾回收机制
引子:
我们定义变量会申请内存空间来存放变量的值, 而内存的容量是有限的, 当一个变量值没有用了 (简称垃圾) 就应该将其占用的内存给回收掉, 而变量名是访问到变量值的唯一方式, 所以当一个变量值没有关联任何变量名时, 我们就无法再访问到该变量值了, 该变量值就是一个垃圾会被 Python 解释的垃圾回收机制自动回收...
一, 什么是垃圾回收机制?
垃圾回收机制 (简称 GC) 是 Python 解释器自带一种机制, 专门用来回收不可用的变量值所占用的内存空间
二, 为什么要用垃圾回收机制?
程序运行过程中会申请大量的内存空间, 而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出), 导致程序崩溃, 因此管理内存是一件重要且繁杂的事情, 而 python 解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来.
三, 垃圾回收机制原理分析
Python 的 GC 模块主要运用了 "引用计数"(reference counting)来跟踪和回收垃圾. 在引用计数的基础上, 还可以通过 "标记 - 清除"(mark and sweep)解决容器对象可能产生的循环引用的问题, 并且通过 "分代回收"(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率.
1, 什么是引用计数?
引用计数就是: 变量值被变量名关联的次数
如: name='jason'
变量值 jason 被关联了一个 name, 称之为引用计数为 1
引用计数增加:
- x=10 (此时, 变量值 10 的引用计数为 1)
- y=x (此时, 把 x 的内存地址给了 y, 此时, x,y 都关联了 10, 所以变量值 10 的引用计数为 2)
引用计数减少:
- x=3(此时, x 与 10 解除了关联, 与 3 建立了关联, 变量 10 的引用计数为 1)
- del y(del 的意思是解除变量名 y 与变量值 10 的关联关系, 此时, 变量 10 的引用计数为 0)
这样变量值 10 的引用计数为 0, 其占用的内存地址就会被回收
- # 变量名 l1 指向列表 1, 变量名 l2 指向列表 2, 如下
- >>> l1=['列表 1 中的第一个元素'] # 列表 1 被引用一次
- >>> l2=['列表 2 中的第一个元素'] # 列表 2 被引用一次
- >>> l1.append(l2) # 把列表 2 追加到 l1 中作为第二个元素, 列表 2 的引用计数为 2
- >>> l2.append(l1) # 把列表 1 追加到 l2 中作为第二个元素, 列表 1 的引用计数为 2
- # l1 与 l2
- # l1 = ['列表 1 中的第一个元素', 列表 2 的内存地址]
- # l2 = ['列表 2 中的第一个元素', 列表 1 的内存地址]
- >>> l1
- ['列表 1 中的第一个元素', ['列表 2 中的第一个元素', [...]]]
- >>> l2
- ['列表 2 中的第一个元素', ['列表 1 中的第一个元素', [...]]]
- >>> l1[1][1][0]
- '列表 1 中的第一个元素'
来源: https://www.cnblogs.com/wanlei/p/10216864.html