Unexpected result from sys.getrefcount(来自 sys.getrefcount 的意外结果)
问题描述
当我输入时:
>>> astrd = 123
>>> import sys
>>> sys.getrefcount(astrd)
3
>>>
我不知道 astrd
在哪里使用了 3 次?
I am not getting where is astrd
used 3 times ?
推荐答案
被引用3次的不是astrd
,而是值123
.astrd
只是(不可变)数字 123 的名称,可以多次引用.除此之外,通常共享小整数:
It's not astrd
that is referenced three times, but the value 123
. astrd
is simply a name for the (immutable) number 123, which can be referenced however many times. Additionally to that, small integers are usually shared:
>>> astrd = 123
>>> sys.getrefcount(astrd)
4
>>> j = 123
>>> sys.getrefcount(astrd)
5
在第二个赋值中,没有创建新的整数,而是 j
只是整数 123
的新名称.
In the second assignment, no new integer is created, instead j
is just a new name for the integer 123
.
但是,给定非常大的整数,这不成立:
However, given very large integers, this does not hold:
>>> i = 823423442583
>>> sys.getrefcount(i)
2
>>> j = 823423442583
>>> sys.getrefcount(i)
2
共享整数是 CPython(以及其他)的一个实现细节.由于小整数经常被实例化,共享它们可以节省大量内存.这是因为整数是不可变的.
Shared integers are an implementation detail of CPython (among others). Since small integers are instantiated very often, sharing them saves a lot of memory. This is made possible by the fact that integers are immutable in the first place.
有关第二个示例中的附加参考,请参阅.codeape 的回答.
For the additional reference in the second example, cf. codeape's answer.
这篇关于来自 sys.getrefcount 的意外结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:来自 sys.getrefcount 的意外结果


基础教程推荐
- 用于分类数据的跳跃记号标签 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 筛选NumPy数组 2022-01-01