我的 PyObject 在獲取它的值時變成了一個 Bytes 對象所以最近,我正在用 C 做一個項目,我在其中實現了幾種類型的樹,以便能夠在 python 中使用它們,因為 C btree 實現比 Python 快得多。(Ikr 有一些可用的庫,但由于在鎖定期間我有更多的空閑時間,我想,我可以做我自己的庫。)一切正常,直到我想找到一個元素,并在同一行打印它的值。當我這樣做時,我的Node對象變成了一個Bytes對象,沒有任何進一步的賦值。更多信息操作系統:Ubuntu 16.04。Python 版本:Python 3.5.2GCC:5.4.0-6 Ubuntu蟒蛇代碼:import mylibimport randommaxv = 10def addValues(tree, values): for value in values: tree.insert(value)def main(): my_list = [i for i in range(maxv)] #random.shuffle(my_list) tree = mylib.BinaryTree('test') addValues(tree, my_list) print(tree.find(3).getValue()) print(tree.sort(False)) main()預期輸出(如果主函數中最后一行之前的行是有效的print(tree.find(3))):3[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]我用上面的測試代碼得到的輸出:3Segmentation fault發生分段錯誤,因為包含值的節點在打印其值時3成為Bytes對象。下面的代碼將打印新的Node.import mylibimport randommaxv = 10def addValues(tree, values): for value in values: tree.insert(value)def main(): my_list = [i for i in range(maxv)] #random.shuffle(my_list) tree = mylib.BinaryTree('test') addValues(tree, my_list) print(tree.find(0).getValue()) #0 is going to be the root node's value, since random.shuffle is not happening. print(tree.root) print(tree.sort(False)) main()輸出:0b'0'Segmentation fault我花了幾天時間對此進行調試,而且由于我絕對不是 C 編程高手,(您將在下面看到),我找不到錯誤。我想繼續,并實現更多功能,但我無法找到錯誤。我有可能錯過了一些如此微不足道的事情,或者我不知道的事情。遺憾的是,我不是經驗豐富的 C 程序員。:/我的模塊包含更多代碼,我不會發布這個問題不需要的代碼。如果您認為應該多看一些以理解我的代碼,請隨時告訴我!我也希望我的代碼可讀性好!有人可以解釋到底發生了什么嗎?謝謝你!
1 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
正如評論中所討論的那樣,這是一個引用計數錯誤。AC API 函數必須返回 Python 所稱的“新引用”。這意味著要么返回在函數內部有意創建的內容(例如 的結果PyList_New
)以增加現有對象的引用計數。
具體來說BinaryTree_Find
,您沒有返回新的參考。因此,Python 最終會釋放一個仍然構成 BinaryTree 一部分的對象。一旦發生這種情況,您可能會遇到各種奇怪且令人困惑的行為。我建議添加Py_INCREF(result)
.
為了幫助診斷此類問題,值得printf
向對象構造函數和析構函數添加語句(作為臨時調試措施),這樣您就可以檢查有關何時分配和釋放它們的假設。
添加回答
舉報
0/150
提交
取消