Re: [心得] 結合Python 與 C(C++) 的優點

看板Python作者 (阿真)時間16年前 (2009/05/22 15:59), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/7 (看更多)
※ 引述《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)
文章代碼(AID): #1A5bj8de (Python)
討論串 (同標題文章)
文章代碼(AID): #1A5bj8de (Python)