python - 来自 sys.getrefcount 的意外结果

标签 python garbage-collection

当我输入时:

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

我不明白 astrd 在哪里使用了 3 次?

最佳答案

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

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

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

但是,给定非常大的整数,这不成立:

>>> i = 823423442583
>>> sys.getrefcount(i)
2
>>> j = 823423442583
>>> sys.getrefcount(i)
2

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

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

关于python - 来自 sys.getrefcount 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/759740/

相关文章:

Python通过正则表达式分割

python - 使用枚举 Django 的下拉菜单主题

python - 如何为 Python 程序禁用 GPU?

garbage-collection - Boehm 和标记指针

performance - 内存管理的90/10规则?

java - 是否可以将类中的类实例设置为 null

python - 得到一个无类型错误的Python 3?

python - 二元运算符应用于逻辑时意味着什么?

java - PrintGCApplicationStoppedTime 报告的 "stop the world"时间真的准确吗?

c# - 动态对象情况下的垃圾收集