代码之家  ›  专栏  ›  技术社区  ›  detly

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

  •  4
  • detly  · 技术社区  · 15 年前

    我注意到了一些关于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 :

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

    这就是我所期望的。。。参考计数降到零 Bar

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

    ... 这个 酒吧 酒吧 匿名创建的对象为零,就像显式分配的对象一样。那么,为什么在创建之后不立即解除分配呢?

    2 回复  |  直到 15 年前
        1
  •  8
  •   luispedro    15 年前

    因为在你打电话之后 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 反对?

        2
  •  3
  •   Ignacio Vazquez-Abrams    15 年前

    因为您正在使用REPL,它将最后一个结果存储在 _ 真正地 毕竟是匿名的。