python - PyObject* 的 "String"表示的生命周期

标签 python c tcl

我在 C-API 上比较了 2 种语言...TclPython...与外部 C-API 函数交互...问题是 const char*字符串表示...

Tcl

Tcl_Obj *obj=…;
const char *str=Tcl_GetStringFromObj(obj,NULL);

strobj 的一部分并且具有与 obj 相同的生命周期...dito...不需要清理

Python

PyObject *obj=…;
PyObject *strObj=PyObject_Str(obj);
const char *str=PyBytes_AsString(strObj);
Py_XDECREF(strObj);

strstrObj 的一部分清理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/

相关文章:

python - 添加对名称和命名空间中有点的 .net 程序集的引用

javascript - 简单的异或消息(Javascript/Tcl)?

tcl - 如何将 tcl 字符串视为十六进制数并将其转换为二进制?

python - 交叉验证数据集折叠随机森林特征重要性

python - spacy 3 - 返回的 lemma_ 将是空字符串

Python random.random - 滚动 0 的机会

不能使用 header 枚举

Python 嵌入 C 时出现语法错误

c - 为什么 int 而不是 unsigned int 用于 C 和 C++ for 循环?

linux - 需要 command-fedora-keyboard 导航键替换 TCL 脚本中的开关 (CLI)