gpt4 book ai didi

python - 了解 sys.getrefcount 结果的差异

转载 作者:行者123 更新时间:2023-12-01 02:48:50 24 4
gpt4 key购买 nike

阅读完 sys.getrefcount 后,我尝试使用下面的代码来玩它:

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

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

最佳答案

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

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

因此,1这是非常常见的,并且很可能在内置模块中大量使用,提供了很多引用:

>>> getrefcount(1)
136

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

>>> 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

关于python - 了解 sys.getrefcount 结果的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com