为什么新的Python变量的引用计数为108? [重复]

问题描述 投票:0回答:1

我一直在尝试sys.getrefcount(),但发现一个奇怪的事情。为什么此脚本输出sys.getrefcount()而不是预期的108(单个引用+ 2的参数)?

getrefcount()
python python-3.8 reference-counting
1个回答
1
投票

确切数字将取决于您的安装细节。对我来说:

import sys
x = 1
print(sys.getrefcount(x))  # 108

构造示例以突出显示:

  • 不是具有引用计数的Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.getrefcount(1) 101 >>> x = 1 >>> sys.getrefcount(x) 102 >>> sys.getrefcount(1) 102 >>> sys.getrefcount(2) 77 >>> sys.getrefcount(3) 32 >>> x = 256 >>> y = 256 >>> x is y True >>> x = 256 >>> y = 257 >>> x is y False >>> sys.getrefcount(255) 4 >>> sys.getrefcount(256) 19 >>> sys.getrefcount(257) 3 >>> x = -5 >>> y = -5 >>> x is y True >>> x = -6 >>> y = -6 >>> x is y False >>> sys.getrefcount(-5) 3 >>> sys.getrefcount(-6) 2 ,而是x。变量名称没有引用;它们是参考。所涉及的事物是values-底层的内存块,用于存储表示诸如1之类的概念所需的信息。

  • 即使谈论变量的引用计数是有意义的,1-像任何其他函数一样,将接收一个值,而不是变量作为其参数。即使您编写sys.getrefcount,也无法使sys.getrefcount(x)的内部实际

    了解

  • sys.getrefcount
  • 不同的整数值将具有不同的引用计数。这是因为提前设置了一堆东西,并且该设置需要内部东西来存储数字值,从而产生对表示这些值的对象的引用。
  • Python的[[

    参考C实现的内部逻辑]确保对于

  • small
  • 整数(显然,从-5到256,包括-5和256,与我的回忆相匹配),但

    不依赖于此行为

    ;对于任何实际目的而言,它[[充其量]]毫无用处,并且通常是将错误和混乱引入代码中的一种非常好的方法),同一对象用于在所使用的任何地方表示给定值(当值x由计算得出,将返回现有的1对象,而不是创建表示相同值的新对象)。因此,此范围内的值至少具有一个额外的引用,因为有一些跟踪对象以供回收之用,因此需要对其进行跟踪。当然,它们可能有更多的参考资料。对于内部实现细节,显然数字1比数字256更重要。但是,即使超出该范围的偶数也将报告具有两个或三个引用。我敢肯定,这与垃圾收集器的工作方式(疯狂地挥手)有关。我不知道为什么正整数似乎比负整数报告更多的引用。
© www.soinside.com 2019 - 2024. All rights reserved.