鱼C论坛

 找回密码
 立即注册
查看: 928|回复: 3

[已解决]求大佬看一下这个运行是什么意思!!

[复制链接]
发表于 2022-1-21 10:04:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import sys
a = 10

#reference
print(sys.getrefcount(a))
list1 = [1,2,3,4,5]
list2 = list1
list3 = list1
print(sys.getrefcount(list1))

这是运行结果
19
4
最佳答案
2022-1-21 10:23:59
sys.getrefcount接口可以查询对象的引用计数。

如果是统计引用次数,那我感觉 print(sys.getrefcount(a)) 应该是 2,但是我这里是 64
那可能是给分配 a 分配个随机数,然后在同一样的代码下,我在 a = 10 下面加个 b = a ,然后 print(sys.getrefcount(a))  65
import sys
a = 11  # 常量 分配随机值 假设现在是 63
b = a   # 引用过 +1

# reference
print(sys.getrefcount(a)) # sys.getrefcount 也算一次引用 所以输出 65
list1 = [1, 2, 3, 4, 5] # 这个就是 1 了
list2 = list1 # +1 
list3 = list1 # +1  
print(sys.getrefcount(list1)) # sys.getrefcount 也算一次引用 所以输出 4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-21 10:23:59 | 显示全部楼层    本楼为最佳答案   
sys.getrefcount接口可以查询对象的引用计数。

如果是统计引用次数,那我感觉 print(sys.getrefcount(a)) 应该是 2,但是我这里是 64
那可能是给分配 a 分配个随机数,然后在同一样的代码下,我在 a = 10 下面加个 b = a ,然后 print(sys.getrefcount(a))  65
import sys
a = 11  # 常量 分配随机值 假设现在是 63
b = a   # 引用过 +1

# reference
print(sys.getrefcount(a)) # sys.getrefcount 也算一次引用 所以输出 65
list1 = [1, 2, 3, 4, 5] # 这个就是 1 了
list2 = list1 # +1 
list3 = list1 # +1  
print(sys.getrefcount(list1)) # sys.getrefcount 也算一次引用 所以输出 4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-21 10:26:43 | 显示全部楼层
大马强 发表于 2022-1-21 10:23
如果是统计引用次数,那我感觉 print(sys.getrefcount(a)) 应该是 2,但是我这里是 64
那可能是给分配 a ...

我查了一下,这个好像和python的回收机制有关联,当它值为零时默认回收掉变量空间
用 del 可以 减一
del list2 # -1
print(sys.getrefcount(list1))  # sys.getrefcount 也算一次引用 所以输出 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-21 13:21:38 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-1-21 13:31 编辑

真要理解,首先得明白 对象的本质,其次还要考虑 垃圾回收机制的影响。

我们可以先看看它的文档说明,再做一些验证:
>>> import sys
>>> help(sys.getrefcount)
Help on built-in function getrefcount in module sys:

getrefcount(...)
    getrefcount(object) -> integer
    
    Return the reference count of object.  The count returned is generally
    one higher than you might expect, because it includes the (temporary)
    reference as an argument to getrefcount().

>>> sys.getrefcount(1)
865
>>> a = 1
>>> sys.getrefcount(a)
865
>>> ls1 = [1, 2]
>>> sys.getrefcount(ls1)
2
>>> ls2 = ls1
>>> sys.getrefcount(ls2)
3
>>> ls3 = ls2
>>> sys.getrefcount(ls2)
4
>>> sys.getrefcount(ls3)
4
>>> sys.getrefcount(ls1)
4
>>> sys.getrefcount(ls1[0])
866
>>> b = 1
>>> sys.getrefcount(ls1[0])
867
>>> sys.getrefcount(1)
868
>>> sys.getrefcount(1)
868
>>>

                               
登录/注册后可看大图

暂时结论:
对于 非引用类型的对象,这个"引用数量"基本没有什么意义(因为有个人Python环境的因素影响,不可预知)。
对于 引用类型的对象,如 列表、字典、自定义类的实例对象 等,有一定参考意义,即 sys.getrefcount(ref_obj) - 1 即 该对象 最终被引用、被绑定到了 多少个 "字符名"上。
如 这里的 [1, 2]这个列表对象,被绑定到了 ls1, ls2, ls3 这3个 字符名 上,所以共有3个"引用",这和我们的通常预期一致,是可以明确的,所以我说"有一定参考意义"。
(若加上getrefcount的形参的临时绑定,就是再+1个,故共 4 个"引用",这也就是帮助文档里所说 one higher than you might expect)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表