Py_INCREF/DECREF:当

2024-09-30 20:35:07 发布

您现在位置:Python中文网/ 问答频道 /正文

以下陈述是否正确:

  • 如果Python对象是在C函数中创建的,但函数没有返回它,则不需要INCREF,而需要DECREF

  • [假]如果函数确实返回它,则需要在接收返回值的函数中INCREF

  • 将C类型变量作为属性(如doubleint等)分配给Python对象时,不需要INCREFDECREF

  • 将Python对象指定为其他Python对象的属性如下:

    PyObject *foo;
    foo = bar // A Python object
    tmp = self->foo;
    Py_INCREF(foo);
    self->foo = foo;
    Py_XDECREF(tmp);
    //taken from the manual, but it is unclear if this works in every situation
    

编辑:-->;我可以在任何情况下安全地使用它吗?(没有遇到过给我带来麻烦的地方)

  • Python对象的dealloc需要DECREF用于它作为属性拥有的所有其他Python对象,但不用于C类型的属性。

编辑

以“C type”作为属性,我的意思是bar和baz:

typedef struct {
    PyObject_HEAD
    PyObject *foo;
    int bar;
    double baz;
} FooBarBaz;

Tags: 对象函数pyself编辑类型属性foo
1条回答
网友
1楼 · 发布于 2024-09-30 20:35:07

首先,仔细阅读这篇文章,特别是最后一段http://docs.python.org/extending/extending.html#ownership-rules

简单的思考方法是考虑参考值。

  1. 你的第一句话是对的。如果您创建了一个新的Python对象(比如PyLong),那么它的引用计数已经是1。如果您要返回它,这是很好的,但是如果您不返回它,它需要由Python垃圾收集,并且它只标记为refcount=0的GC,因此如果您不返回它,您需要DECREF。

  2. 第二种说法是错误的。如果需要返回并创建它,只需返回它。归还转让所有权。如果要在返回之前递增,那么您将告诉Python您也在保留一个副本。同样,如果创建它,refcount=1。如果然后执行INCREF,则refcount=2。但这是而不是您想要的,您想要返回refcount=1。

  3. 我不是很确定我明白了,但这更多的是一个与C相关的问题。如何向Python对象添加intdouble

  4. 你能举个例子说明那种方法行不通吗?

  5. 同样,我不确定C类型何时是Python对象的属性。每一个intdoublelong等都以某种方式被Python对象包装。

上述链接概述了这些答案的注意事项。你真的不应该在读了那篇文章后需要我糟糕的解释。我希望我澄清了,不要再搞混了。

相关问题 更多 >