了解结果中的sys.getrefcount差异

时间:2017-07-10 13:43:36

标签: python reference sys

在阅读sys.getrefcount后,我尝试使用以下代码进行播放:

import sys
go = 102133333333333333333333333
sys.getrefcount(go)
>>> 2
sys.getrefcount(102133333333333333333333333)
>>> 3

为什么我得到这个结果,特别是3个引用102133333333333333333333333数字(或任何高数字)的结果,以及为什么它高于从中返回的引用计数go变量?

1 个答案:

答案 0 :(得分:1)

getrefcount函数返回引用数,包括:

  1. 为参数创建的引用;
  2. 导入代码中定义的所有引用。
  3. 因此,1非常常见,并且很可能在内置模块中使用了很多,它提供了很多参考:

    >>> getrefcount(1)
    136
    

    这同样适用于其他不可变对象,例如字符串和常量:

    >>> getrefcount(True)
    145
    >>> getrefcount("a")
    5
    

    在我的系统上,102133333333333333333333333也提供3,这意味着它在解释器开头导入的代码中使用了两次。

    那你为什么得到这些结果?

    关于go变量,它有两个引用:一个在您定义时创建,另一个在您将其传递给getrefcount时。

    现在约102133333333333333333333333或任何大数字。 首先,this question解释了为什么大数字导致3引用。 基本上,在编译的代码中使用小数字,并且使用它们的所有地方指向相同的地址。 另一方面,在运行时创建编译代码中不存在的数字时,会对其进行编译和存储以进行优化,从而提供两个引用,以及传递给getrefcount的引用。

    但是当运行时编号分配给两个变量时,后者指向同一个地址。 因此,引用数量不会增加,并保持在3

    以下是演示:

    >>> getrefcount(45)
    9
    >>> a = 45
    >>> b = 45
    >>> a is b
    True
    

    现在有一个更大的数字:

    >>> getrefcount(1000)
    3
    >>> a = 1000
    >>> b = 1000
    >>> a is b
    False
    

    以下显示变量如何不指向数字地址:

    >>> a = 1000
    >>> a is 1000
    False