鱼C论坛

 找回密码
 立即注册
查看: 1013|回复: 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
  1. import sys
  2. a = 11  # 常量 分配随机值 假设现在是 63
  3. b = a   # 引用过 +1

  4. # reference
  5. print(sys.getrefcount(a)) # sys.getrefcount 也算一次引用 所以输出 65
  6. list1 = [1, 2, 3, 4, 5] # 这个就是 1 了
  7. list2 = list1 # +1
  8. list3 = list1 # +1  
  9. print(sys.getrefcount(list1)) # sys.getrefcount 也算一次引用 所以输出 4
复制代码

小甲鱼最新课程 -> https://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
  1. import sys
  2. a = 11  # 常量 分配随机值 假设现在是 63
  3. b = a   # 引用过 +1

  4. # reference
  5. print(sys.getrefcount(a)) # sys.getrefcount 也算一次引用 所以输出 65
  6. list1 = [1, 2, 3, 4, 5] # 这个就是 1 了
  7. list2 = list1 # +1
  8. list3 = list1 # +1  
  9. print(sys.getrefcount(list1)) # sys.getrefcount 也算一次引用 所以输出 4
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我查了一下,这个好像和python的回收机制有关联,当它值为零时默认回收掉变量空间
用 del 可以 减一
  1. del list2 # -1
  2. print(sys.getrefcount(list1))  # sys.getrefcount 也算一次引用 所以输出 3
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我们可以先看看它的文档说明,再做一些验证:

  1. >>> import sys
  2. >>> help(sys.getrefcount)
  3. Help on built-in function getrefcount in module sys:

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

  10. >>> sys.getrefcount(1)
  11. 865
  12. >>> a = 1
  13. >>> sys.getrefcount(a)
  14. 865
  15. >>> ls1 = [1, 2]
  16. >>> sys.getrefcount(ls1)
  17. 2
  18. >>> ls2 = ls1
  19. >>> sys.getrefcount(ls2)
  20. 3
  21. >>> ls3 = ls2
  22. >>> sys.getrefcount(ls2)
  23. 4
  24. >>> sys.getrefcount(ls3)
  25. 4
  26. >>> sys.getrefcount(ls1)
  27. 4
  28. >>> sys.getrefcount(ls1[0])
  29. 866
  30. >>> b = 1
  31. >>> sys.getrefcount(ls1[0])
  32. 867
  33. >>> sys.getrefcount(1)
  34. 868
  35. >>> sys.getrefcount(1)
  36. 868
  37. >>>
复制代码


                               
登录/注册后可看大图

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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 12:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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