意外结果来自系统getrefcoun

2024-09-30 02:14:55 发布

您现在位置:Python中文网/ 问答频道 /正文

当我键入:

>>> astrd = 123
>>> import sys
>>> sys.getrefcount(astrd)
3
>>> 

我不知道astrd在哪里用了3次?在


Tags: import键入sysgetrefcountastrd
3条回答

我认为它计算了123的引用,试试其他例子,比如

>>> import sys
>>> astrd = 1
>>> sys.getrefcount(astrd)
177
>>> astrd = 9802374987193847
>>> sys.getrefcount(astrd)
2
>>> 

9802374987193847的参考计数符合codeape的答案。在

这可能是因为数字是不可变的。例如,如果您使用一个列表,它将始终是2(从一个干净的提示就是)。在

顺便说一句,123分我也得2分,也许你的设置有些不同?或者可能跟时间有关?在

引用三次的不是astrd,而是值123astrd只是(不可变)数字123的名称,它可以被引用多次。此外,小整数通常是共享的:

>>> astrd = 123
>>> sys.getrefcount(astrd)
4
>>> j = 123
>>> sys.getrefcount(astrd)
5

在第二个赋值中,不创建新的整数,j只是整数123的一个新名称。在

但是,对于非常大的整数,这不适用于:

^{pr2}$

共享整数是CPython(除其他外)的实现细节。由于小整数经常被实例化,共享它们可以节省大量内存。这是因为整数首先是不可变的。在

对于第二个示例中的附加引用,请参见codeape's answer。在

getrefcount docstring

... The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().

另外两个引用意味着python内部保存着对对象的两个引用。也许locals()和globals()字典各自算作一个引用?在

相关问题 更多 >

    热门问题