This question already has an answer here:
Unexpected value from sys.getrefcount
(1个答案)
2年前关闭。
阅读有关
为什么我得到这个结果,特别是3个引用
其他不可变对象也是如此,例如字符串和常量:
在我的系统上,
那为什么要得到这些结果呢?
关于
现在有关
首先,this question解释了为什么大量引用导致
基本上,在编译的代码中使用小数字,并且所有使用小数字的地方都指向同一地址。
另一方面,在运行时创建已编译代码中不存在的数字时,将对其进行编译和存储以进行优化,这将提供两个引用以及一个传递给
但是,当将运行时编号分配给两个变量时,后者将不会指向相同的地址。
因此,引用的数量不会增加,而是保持在
这是演示:
现在数量更多:
下面显示了变量如何不指向数字地址:
(1个答案)
2年前关闭。
阅读有关
sys.getrefcount
的内容后,我尝试使用以下代码进行操作:import sys
go = 102133333333333333333333333
sys.getrefcount(go)
>>> 2
sys.getrefcount(102133333333333333333333333)
>>> 3
为什么我得到这个结果,特别是3个引用
102133333333333333333333333
数字(或任何高数字)的结果,为什么它比go
变量返回的引用计数高? 最佳答案
getrefcount
函数返回引用数,包括:
为参数创建的引用;
导入代码中定义的所有引用。
因此,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
09-11 19:25