2024-09-30 02:14:55 发布
网友
当我键入:
>>> astrd = 123 >>> import sys >>> sys.getrefcount(astrd) 3 >>>
我不知道astrd在哪里用了3次?在
astrd
我认为它计算了123的引用,试试其他例子,比如
>>> import sys >>> astrd = 1 >>> sys.getrefcount(astrd) 177 >>> astrd = 9802374987193847 >>> sys.getrefcount(astrd) 2 >>>
9802374987193847的参考计数符合codeape的答案。在
这可能是因为数字是不可变的。例如,如果您使用一个列表,它将始终是2(从一个干净的提示就是)。在
顺便说一句,123分我也得2分,也许你的设置有些不同?或者可能跟时间有关?在
引用三次的不是astrd,而是值123。astrd只是(不可变)数字123的名称,它可以被引用多次。此外,小整数通常是共享的:
123
>>> astrd = 123 >>> sys.getrefcount(astrd) 4 >>> j = 123 >>> sys.getrefcount(astrd) 5
在第二个赋值中,不创建新的整数,j只是整数123的一个新名称。在
j
但是,对于非常大的整数,这不适用于:
共享整数是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().
getrefcount()
另外两个引用意味着python内部保存着对对象的两个引用。也许locals()和globals()字典各自算作一个引用?在
我认为它计算了123的引用,试试其他例子,比如
9802374987193847的参考计数符合codeape的答案。在
这可能是因为数字是不可变的。例如,如果您使用一个列表,它将始终是2(从一个干净的提示就是)。在
顺便说一句,123分我也得2分,也许你的设置有些不同?或者可能跟时间有关?在
引用三次的不是
astrd
,而是值123
。astrd
只是(不可变)数字123的名称,它可以被引用多次。此外,小整数通常是共享的:在第二个赋值中,不创建新的整数,
j
只是整数123
的一个新名称。在但是,对于非常大的整数,这不适用于:
^{pr2}$共享整数是CPython(除其他外)的实现细节。由于小整数经常被实例化,共享它们可以节省大量内存。这是因为整数首先是不可变的。在
对于第二个示例中的附加引用,请参见codeape's answer。在
从getrefcount docstring:
另外两个引用意味着python内部保存着对对象的两个引用。也许locals()和globals()字典各自算作一个引用?在
相关问题 更多 >
编程相关推荐