Re: [心得] 結合Python 與 C(C++) 的優點
※ 引述《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)
討論串 (同標題文章)
Python 近期熱門文章
PTT數位生活區 即時熱門文章