gpt4 book ai didi

python - 了解类变量的引用计数

转载 作者:太空狗 更新时间:2023-10-30 01:16:47 25 4
gpt4 key购买 nike

这是为了更好地理解引用计数在 Python 中的工作原理。

让我们创建一个类并实例化它。该实例的引用计数将为 1 ( getrefcount 显示 2 因为它自己的内部结构引用该类实例增加引用计数 1 ):

>>> from sys import getrefcount as grc
>>> class A():
def __init__(self):
self.x = 100000


>>> a = A()
>>> grc(a)
2

a的内部变量 x2引用资料:

>>> grc(a.x)
3

我希望它被 a 引用和 A__init__方法。然后我决定检查一下。

所以我创建了一个临时变量b__main__命名空间只是为了能够访问变量 x .它增加了引用号 1让它变成3 (如预期的那样):

>>> b = a.x
>>> grc(a.x)
4

然后我删除了类实例,引用计数减少了 1 :

>>> del a
>>> grc(b)
3

所以现在有2引用资料:一个是 b一个是 A (如我所料)。

通过删除 A来自 __main__ namespace 我希望计数减少 1再次。

>>> del A
>>> grc(b)
3

但这并没有发生。没有课A或其可能引用 100000 的实例, 但它仍然被 b 以外的东西引用在__main__命名空间。

所以,我的问题是,100000 是什么?由b引用?


BrenBarn 建议我应该使用 object()而不是可能存储在内部某处的数字。

>>> class A():
def __init__(self):
self.x = object()


>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2

删除实例后a b 只有一个引用这是非常合乎逻辑的。

唯一需要理解的是为什么数字 100000 不是这样的.

最佳答案

a.x为整数10000。该常量被A__init__()方法对应的代码对象引用。代码对象始终包含对代码中所有文字常量的引用:

>>> def f(): return 10000
>>> f.__code__.co_consts
(None, 10000)

线

del A

只删除名称A 并减少A 的引用计数。在 Python 3.x(但不是 2.x)中,类通常包含一些循环引用,因此只有在您显式运行垃圾收集器时才会被垃圾收集。事实上,使用

import gc
gc.collect()

del A 之后确实会导致 b 的引用计数减少。

关于python - 了解类变量的引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10874499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com