首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解结果中的sys.getrefcount差异

了解结果中的sys.getrefcount差异
EN

Stack Overflow用户
提问于 2017-07-10 21:43:36
回答 1查看 475关注 0票数 2

在阅读了有关sys.getrefcount的内容后,我尝试使用下面的代码:

代码语言:javascript
复制
import sys
go = 102133333333333333333333333
sys.getrefcount(go)
>>> 2
sys.getrefcount(102133333333333333333333333)
>>> 3

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

EN

回答 1

Stack Overflow用户

发布于 2017-07-10 21:50:05

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

  1. 为参数创建的引用;
  2. 导入代码中定义的所有引用。

因此,1非常常见,并且很可能在内置模块中大量使用,它提供了许多参考:

代码语言:javascript
复制
>>> getrefcount(1)
136

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

代码语言:javascript
复制
>>> getrefcount(True)
145
>>> getrefcount("a")
5

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

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

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

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

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

以下是演示:

代码语言:javascript
复制
>>> getrefcount(45)
9
>>> a = 45
>>> b = 45
>>> a is b
True

现在有一个更大的数字:

代码语言:javascript
复制
>>> getrefcount(1000)
3
>>> a = 1000
>>> b = 1000
>>> a is b
False

下面显示了变量如何不指向号码地址:

代码语言:javascript
复制
>>> a = 1000
>>> a is 1000
False
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45013663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档