我在 C-API 上比较了 2 种语言...Tcl 和 Python...与外部 C-API 函数交互...问题是 const char*
字符串表示...
Tcl
Tcl_Obj *obj=…;
const char *str=Tcl_GetStringFromObj(obj,NULL);
→ str
是 obj
的一部分并且具有与 obj
相同的生命周期...dito...不需要清理
Python
PyObject *obj=…;
PyObject *strObj=PyObject_Str(obj);
const char *str=PyBytes_AsString(strObj);
Py_XDECREF(strObj);
→ str
是 strObj
的一部分清理Py_XDECREF(strObj)
需要...
Python 中的清理是个问题,因为这需要奇怪的内务管理......因为 str
的生命周期取决于代码逻辑
即使我自己做str
使用strstr
复制我必须清理我自己的副本。
问题:PyObject
的一般生命周期是多少?和字符串表示
最佳答案
这是管理对象字符串表示的两种不同方法。
来自Tcl docs for Tcl_GetStringFromObj
:
The storage referenced by the returned byte pointer is owned by the object manager.
来自Python docs for PyObject_Str
:
Return value: New reference. Compute a string representation of object o.
因此,Python 决定在每次请求时计算对象的字符串表示形式,并且调用 PyObject_Str
与调用 Tcl_NewStringObj
基本相同。这确实需要开发人员对返回的对象进行一些内存管理,但另一方面,这意味着您不必担心每次更改对象时管理对象的内部字符串表示:字符串只是被计算出来每次被请求时。
关于python - PyObject* 的 "String"表示的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53377814/