我一直在尝试sys.getrefcount()
,但发现一个奇怪的事情。为什么此脚本输出sys.getrefcount()
而不是预期的108
(单个引用+ 2
的参数)?
getrefcount()
确切数字将取决于您的安装细节。对我来说:
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
。参考C实现的内部逻辑]确保对于
不依赖于此行为
;对于任何实际目的而言,它[[充其量]]毫无用处,并且通常是将错误和混乱引入代码中的一种非常好的方法),同一对象用于在所使用的任何地方表示给定值(当值x
由计算得出,将返回现有的1
对象,而不是创建表示相同值的新对象)。因此,此范围内的值至少具有一个额外的引用,因为有一些跟踪对象以供回收之用,因此需要对其进行跟踪。当然,它们可能有更多的参考资料。对于内部实现细节,显然数字1
比数字256
更重要。但是,即使超出该范围的偶数也将报告具有两个或三个引用。我敢肯定,这与垃圾收集器的工作方式(疯狂地挥手)有关。我不知道为什么正整数似乎比负整数报告更多的引用。