文章插图
③删除第一个变量:del text

文章插图
④删除第二个变量:
del new_text
文章插图
此时 "hello,world" 对象的引用计数为:0,被当成了垃圾 。下一步,就该被我们的垃圾回收器给收走了 。

文章插图
4. 引用计数如何变化上面我们了解了什么是引用计数 。那这个参数什么时候会发生变化呢?

文章插图
4.1 引用计数加一的情况
- 对象被创建
a = "hello,world"- 对象被别的变量引用(赋值给一个变量)
b = a- 对象被作为元素,放在容器中(比如被当作元素放在列表中)
list = [ ] list.Append(a)- 对象作为参数传递给函数
func(a) 4.2 引用计数减一
- 对象的引用变量被显示销毁
del a- 对象的引用变量赋值引用其他对象
a = "hello, Python" # a的原来的引用对象:a = "hello,world"- 对象从容器中被移除,或者容器被销毁(例:对象从列表中被移除,或者列表被销毁)
del listlist.remove(a)- 一个引用离开了它的作用域
func():a = "hello,world"return func() # 函数执行结束以后,函数作用域里面的局部变量a会被释放 4.3 查看对象的引用计数如果要查看对象的引用计数,可以通过内置模块 sys 提供的 getrefcount 方法去查看 。
import sysa = "hello,world"print(sys.getrefcount(a))注意:当使用某个引用作为参数,传递给 getrefcount() 时,参数实际上创建了一个临时的引用 。因此,getrefcount() 所得到的结果,会比期望的多 15. 垃圾回收机制其实Python的垃圾回收机制,我们前面已经说得差不多了 。
Python通过引用计数的方法来说实现垃圾回收,当一个对象的引用计数为0的时候,就进行垃圾回收 。但是如果只使用引用计数也是有点问题的 。所以,python又引进了 标记-清除 和 分代收集 两种机制 。
Python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略 。
前面的引用计数我们已经了解了,那这个标记-清除跟分代收集又是什么呢?

文章插图
5.1 引用计数机制缺点Python语言默认采用的垃圾收集机制是“引用计数法 ”,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然被很多编程语言使用 。
引用计数法:每个对象维护一个 ob_refcnt 字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数 ob_refcnt 加1,每当该对象的引用失效时计数 ob_refcnt 减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放 。
缺点:
- 需要额外的空间维护引用计数
- 无法解决循环引用问题
a = {"key":"a"}# 字典对象a的引用计数:1b = {"key":"b"}# 字典对象b的引用计数:1a["b"] = b# 字典对象b的引用计数:2b["a"] = a# 字典对象a的引用计数:2del a# 字典对象a的引用计数:1del b# 字典对象b的引用计数:1看上面的例子,明明两个变量都删除了,但是这两个对象却没有得到释放 。原因是他们的引用计数都没有减少到0 。而我们垃圾回收机制只有当引用计数为0的时候才会释放对象 。这是一个无法解决的致命问题 。这两个对象始终不会被销毁,这样就会导致内存泄漏 。那怎么解决这个问题呢?这个时候 标记-清除 就排上了用场 。标记清除可以处理这种循环引用的情况 。
5.2 标记-清除策略Python采用了标记-清除策略,解决容器对象可能产生的循环引用问题 。
推荐阅读
- Python实现天气查询功能
- 用Python爬取六大平台的弹幕、评论,看这一篇就够了
- Python 中的自然语言处理入门
- 用python帮别人写了个文字识别程序
- 3个提升Python运行速度的方法,很实用
- 手把手教你编写Python抢购脚本
- Python生成遍历暴力破解密码,实战的效果差强人意了
- 详解Python软件安装教程和配置,小白都能看懂的教程,值得收藏
- 被称之为永远的神!就这6个Python爬虫开源项目?
- Python黑科技:暴力破解,你的密码是否安全呢?
