gpt4 book ai didi

python - 为什么不立即释放匿名 (C)Python 对象?

转载 作者:太空狗 更新时间:2023-10-30 01:55:59 26 4
gpt4 key购买 nike

我注意到有关 CPython 的对象释放的一些事情激起了我的好奇心。假设我定义了一个类型,它从它的 tp_dealloc 函数打印一条消息:

static void pyfoo_Bar_dealloc(pyfoo_Bar* self)
{
PySys_WriteStdout("Bar freed\n");
self->ob_type->tp_free((PyObject*)self);
}

我还对分配器做了正确的事情:

PyMODINIT_FUNC initpyfoo(void) 
{
PyObject* m;

pyfoo_BarType.tp_new = PyType_GenericNew;
/* ... */
}

我用 pyfoo.so 编译它并在目录中运行 Python 2.6 解释器:

>>> import pyfoo
>>> a = pyfoo.Bar()
>>> a = None
Bar freed
>>> quit()

这正是我所期望的...引用计数降为零并且收集了 Bar 对象。但现在如果我这样做:

>>> import pyfoo
>>> pyfoo.Bar()
<pyfoo.Bar object at 0x7f7c6d8f2080>
>>> quit()
Bar freed

... Bar 对象在解释器退出之前不会被收集。但可以肯定的是,匿名创建的 Bar 对象的引用计数为零,就像显式分配的一样。那么为什么它在创建后不立即释放呢?

(我正在使用 GCC 4.4.5 编译的 Python 2.6.6 在 Debian Squeeze 上执行此操作。我知道这不是“错误”,我知道 Python 语言不会对 Python 解释器施加任何特定限制这...我只想知道幕后发生了什么,这使得它忽略了像这样的匿名对象。)

最佳答案

因为在调用 pyfoo.Bar() 之后,仍然可以使用特殊对象 _

访问该对象

顺便说一下,这适用于纯 Python:

class X:
def __del__(self):
print 'deleted'

之后:

 >>>a = X()
>>>a = None
deleted
>>>X()
<__main__.X instance at 0x7f391bb066c8>
>>> _
<__main__.X instance at 0x7f391bb066c8>
>>> 3 # causes _ to be reassigned
deleted
3

注意重新分配 _ 是如何隐式删除 X 对象的吗?

关于python - 为什么不立即释放匿名 (C)Python 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4129950/

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