python - PyObject* 的“字符串”表示的生命周期
问题描述
我比较了 2 种语言…… C-API 上的Tcl和Python ……与外部 C-API 函数交互……问题在于const char*
字符串表示……</p>
Tcl
Tcl_Obj *obj=…;
const char *str=Tcl_GetStringFromObj(obj,NULL);
→ 它是 thestr
的一部分,并且与... dito...obj
具有相同的生命周期...不需要清理obj
Python
PyObject *obj=…;
PyObject *strObj=PyObject_Str(obj);
const char *str=PyBytes_AsString(strObj);
Py_XDECREF(strObj);
→ 这是需要清理str
的一部分...</p>
strObj
Py_XDECREF(strObj)
python 中的清理是个问题,因为这需要一个奇怪的内务管理……因为str
依赖代码逻辑的生命周期
即使我str
使用我的 OWN 副本,strstr
我也必须清理我的 OWN 副本。
PyObject
问题:an和String-Representation的一般生命周期是多少
解决方案
这是管理对象的字符串表示的两种不同方法。
返回的字节指针所引用的存储空间归对象管理器所有。
返回值:新引用。计算对象 o 的字符串表示。
因此 Python 决定每次请求对象时都计算对象的字符串表示形式,并且调用与调用PyObject_Str
基本相同Tcl_NewStringObj
。这确实需要开发人员对返回的对象进行一些内存管理,但另一方面,这意味着您不必担心每次更改对象时管理对象的内部字符串表示:字符串只是简单地计算每次被要求。
推荐阅读
- julia - BoundsError:尝试访问索引 [2] 处的 1 元素数组 {Any,1}
- php - 我的搜索结果没有出现使用 php 代码
- rest - REST API 设计是否应该尊重继承?
- angular - 在 Angular 中 ng-content 和 ng-template 做什么?
- python - 即使正在更新变量,循环也不会退出
- r - 按日期排列的时间序列数据
- php - ubuntu 20.04 上的管理员和 PHP 8.0 的问题
- django - 如何在 .py 文件中创建模型实例?
- c++ - Visual Studios 将我的“£”更改为“?” 在运行时
- python - Spyder 开始为每个控制台启动单独的 Python 应用程序