以下陈述是否正确:
如果Python对象是在C函数中创建的,但函数没有返回它,则不需要INCREF
,而需要DECREF
。
[假]如果函数确实返回它,则需要在接收返回值的函数中INCREF
将C类型变量作为属性(如double
、int
等)分配给Python对象时,不需要INCREF
或DECREF
。
将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
编辑:-->;我可以在任何情况下安全地使用它吗?(没有遇到过给我带来麻烦的地方)
DECREF
用于它作为属性拥有的所有其他Python对象,但不用于C类型的属性。编辑
以“C type”作为属性,我的意思是bar和baz:
typedef struct {
PyObject_HEAD
PyObject *foo;
int bar;
double baz;
} FooBarBaz;
首先,仔细阅读这篇文章,特别是最后一段http://docs.python.org/extending/extending.html#ownership-rules
简单的思考方法是考虑参考值。
你的第一句话是对的。如果您创建了一个新的Python对象(比如
PyLong
),那么它的引用计数已经是1。如果您要返回它,这是很好的,但是如果您不返回它,它需要由Python垃圾收集,并且它只标记为refcount=0的GC,因此如果您不返回它,您需要DECREF。第二种说法是错误的。如果需要返回并创建它,只需返回它。归还转让所有权。如果要在返回之前递增,那么您将告诉Python您也在保留一个副本。同样,如果创建它,refcount=1。如果然后执行INCREF,则refcount=2。但这是而不是您想要的,您想要返回refcount=1。
我不是很确定我明白了,但这更多的是一个与C相关的问题。如何向Python对象添加
int
或double
?你能举个例子说明那种方法行不通吗?
同样,我不确定C类型何时是Python对象的属性。每一个
int
、double
、long
等都以某种方式被Python对象包装。上述链接概述了这些答案的注意事项。你真的不应该在读了那篇文章后需要我糟糕的解释。我希望我澄清了,不要再搞混了。
相关问题 更多 >
编程相关推荐