作者KSJ (阿真)
看板Python
标题Re: [心得] 结合Python 与 C(C++) 的优点
时间Fri May 22 15:59:01 2009
※ 引述《Tiberius (渴望平凡的幸福)》之铭言:
: ※ 引述《KSJ (阿真)》之铭言:
: : PS.我对reference count怎麽解释 跟它在Python、C之间有什麽关系
: : 目前还是一头雾水...有人有推荐什麽好的网站吗??
: : 官网有看过 不过感觉还不够基本...
: 简单来说 (官网文件翻译+简化的意味)
: 如果你的函式是用来生一个新东西传回去给 Python 用,
: 那在传回去之前要帮它 Py_INCREF().
: 如果呼叫的函式在手册里写 Return value: New reference 的话,
: 就可以直接传回去给 Python code 用;
: 如果只在 C 里面用, 没有传回去的话, 用完记得 Py_DECREF().
关於以上 有些程式上写法的问题想请教
大概是像下面三种情况:
1.很正规的写法
把py_XYTZseq中第i个 py_数值(xdata)
转成 py_float(fxdata)
再转成c_double 存入 Xseq[j]
然後再把有new reference(新)的pyobject都decref掉
PyObject *xdata = PySequence_Fast_GET_ITEM(XYTZseq, i); //借
PyObject *fxdata = PyNumber_Float(xdata); //新
Xseq[j] = PyFloat_AS_DOUBLE(fxdata); //无
Py_DECREF(xdata);
2.做的事都一样
PyObject *xdata = PySequence_Fast_GET_ITEM(XYTZseq, i); //借
xdata = PyNumber_Float(xdata); //新
//^^^^^^此处xdata 指向原来的自己
//不知道会不会出什麽问题
Xseq[j] = PyFloat_AS_DOUBLE(xdata);
Py_DECREF(xdata);
3.把所有的东西写成一行
Xseq[j] = //(bbs不够宽换行一下)
PyFloat_AS_DOUBLE(PyNumber_Float(PySequence_Fast_GET_ITEM(XYTZseq, i)))
里面都没有指定"间接"的py_object去接中途所算的值
那这样并没有任何"东西"reference+1吗??
这样还会需要de掉什麽吗 或是说这是种不好的写法呢?
: 如果呼叫的函式在手册里写 Return value: Borrowed reference 的话,
: 要传回去给 Python 用, 或者是自己暂存下来之前, 就要先呼叫 Py_INCREF()
: (这就是 Reference counting 里面 Thin Ice 那段举的例子)
: 自己暂存下来的东西用完之後, 理所当然要呼叫 Py_DECREF() 才能扔掉
: 就这三点而已, 应该不会很复杂吧 ... XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.63.180
※ 编辑: KSJ 来自: 140.112.63.180 (05/22 17:29)