首页 > 分享 > python 引用计数问题

python 引用计数问题

文章目录 对象的引用计数+1的情况:1. 对象被创建2. 对象被引用3. 对象被作为参数,传入到一个函数中4. 对象作为一个元素,存储在容器中 对象的引用计数-1的情况:1. 对象的别名被赋予新的对象2. 对象的别名被显式销毁3. 一个对象离开它的作用域4. 对象所在的容器被销毁,或从容器中删除对象

python的垃圾回收采用的是 引用计数机制为主和 分代回收机制为辅的 结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外。(默认对象的引用计数永远不会变成0)

对象的引用计数+1的情况:

1. 对象被创建

>>> import sys >>> a = 23 >>> sys.getrefcount(a) 6 1234

这里23这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池,-5~256之间的这些对象会被自动创建加载到内存中等待调用;a = 23是为23这个整数对象增加了一个引用。

>>> class MyName(): ... pass ... >>> sys.getrefcount(MyName()) 1 12345

结果为1,是因为sys.getrefcount(MyName())函数也算一个引用。

2. 对象被引用

>>> a = 3.1415926 >>> b = a >>> c = b >>> sys.getrefcount(a) 4 >>> sys.getrefcount(b) 4 >>> sys.getrefcount(c) 4 123456789

每一次赋值都会增加数据操作的引用次数,要记住引用的是变量a,b,c等指向的数据 3.1415926 ,而不是变量本身。

3. 对象被作为参数,传入到一个函数中

>>> a = 3.1415926 # 增加一个引用 count = 1 >>> b = a # 增加一个引用 count = 2 >>> c = b # 增加一个引用 count = 3 >>> sys.getrefcount(b) # 增加一个引用 count = 4 执行完毕后引用销毁,减少一个引用 count = 3 4 >>> sys.getrefcount(c) # 增加一个引用 count = 4 执行完毕后引用销毁,减少一个引用 count = 3 4 1234567

函数 sys.getrefcount() 调用时 会增加一个引用,调用完又销毁一个引用。 实际上就是实参传给形参的问题。

4. 对象作为一个元素,存储在容器中

>>> a = 3.1415926 # 增加一个引用 count = 1 >>> sys.getrefcount(a) 2 >>> b = a # 增加一个引用 count = 2 >>> sys.getrefcount(a) 3 >>> list_ = [a, b] # 增加两个引用 count = 4 >>> sys.getrefcount(a) 5 123456789

对象的引用计数-1的情况:

1. 对象的别名被赋予新的对象

>>> a = 3.1415926 # 增加一个引用 count = 1 >>> b = a # 增加一个引用 count = 2 >>> sys.getrefcount(a) 3 >>> b = -3.1415926 # 原对象减少一个引用 count = 1 >>> sys.getrefcount(a) 2 1234567

2. 对象的别名被显式销毁

>>> a = 3.1415926 # 增加一个引用 count = 1 >>> b = a # 增加一个引用 count = 2 >>> sys.getrefcount(a) 3 >>> del b # 减少一个引用 count = 1 >>> sys.getrefcount(a) 2 1234567

3. 一个对象离开它的作用域

>>> a = 3.1415926 # 增加一个引用 count = 1 >>> sys.getrefcount(a) # 增加一个引用 count = 1 ==> 打印 2 ==> 减少一个引用 count = 1 2 123

a 作为参数传递到 sys.getrefcount(a) 函数中,只在函数中起作用,一旦执行完毕就会销毁。

4. 对象所在的容器被销毁,或从容器中删除对象

>>> a = 3.1415926 >>> sys.getrefcount(a) 2 >>> list_ = [a,1,2,3] >>> sys.getrefcount(a) 3 >>> del list_ >>> sys.getrefcount(a) 2 123456789

相关知识

2019辽宁省考行测数量之边端计数问题(一)
SKYNE/python
【Python】基础
python数据分析与展示
小明准备在阳台种植玫瑰、百合、牡丹和兰花4种盆栽,共种8盆,并且每种花至少种1盆,则小明买盆截的方法共有
python 玫瑰花程序
引用 引用 如何自制水培花卉营养液?
python玫瑰花代码简单
python玫瑰花代码讲解
Python编写玫瑰花

网址: python 引用计数问题 https://m.huajiangbk.com/newsview546443.html

所属分类:花卉
上一篇: 鸢尾花数据可视化——基于matp
下一篇: 鸢尾花数据集分析