python的垃圾回收采用的是 引用计数机制为主和 分代回收机制为辅的 结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外。(默认对象的引用计数永远不会变成0)
>>> 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())函数也算一个引用。
>>> 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 ,而不是变量本身。
>>> 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() 调用时 会增加一个引用,调用完又销毁一个引用。 实际上就是实参传给形参的问题。
>>> 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
>>> a = 3.1415926 # 增加一个引用 count = 1 >>> b = a # 增加一个引用 count = 2 >>> sys.getrefcount(a) 3 >>> b = -3.1415926 # 原对象减少一个引用 count = 1 >>> sys.getrefcount(a) 2 1234567
>>> a = 3.1415926 # 增加一个引用 count = 1 >>> b = a # 增加一个引用 count = 2 >>> sys.getrefcount(a) 3 >>> del b # 减少一个引用 count = 1 >>> sys.getrefcount(a) 2 1234567
>>> a = 3.1415926 # 增加一个引用 count = 1 >>> sys.getrefcount(a) # 增加一个引用 count = 1 ==> 打印 2 ==> 减少一个引用 count = 1 2 123
a 作为参数传递到 sys.getrefcount(a) 函数中,只在函数中起作用,一旦执行完毕就会销毁。
>>> 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 |
下一篇: 鸢尾花数据集分析 |