【问题标题】:Is there a way to resize python list using Python-C API?有没有办法使用 Python-C API 调整 python 列表的大小?
【发布时间】:2019-02-27 09:15:04
【问题描述】:
我的 C 应用程序正在加载 python 解释器 dll 并调用函数 list = PyList_New(len) 来创建一个新的“len”大小的 python 列表。
两个问题:
1. 如果我拨打PyList_Append(list, item) 超过len 次会怎样?我认为它应该引发异常。我的理解正确吗?
2.更重要的是,我的第二个问题是是否有办法调整列表大小?我查看了 C API:https://docs.python.org/2/c-api/list.html#c.PyList_SetItem,但找不到这样的 API。有什么建议/cmets/解决方法吗?
我的问题的上下文是,我需要比已知列表项和它们的数量更早地创建列表。
【问题讨论】:
标签:
python
python-3.x
python-2.7
python-c-api
【解决方案1】:
PyList_New 创建一个用NULL 指针填充的列表。在将列表发送回 Python 或在其上调用任何 Python 函数之前,您应该使用 PyList_SetItem 设置所有这些指针。
PyList_Append(和PyList_Insert)实际上等同于从Python调用somelist.append(和somelist.insert)。他们为您调整列表大小。我不能 100% 确定他们是否考虑了任何 NULL 元素,因此最好不要在您从 PyList_New 制作的列表中调用它们并且您还没有完全填写。你在做什么(分配一个带有一些 NULL 指针的列表然后附加它)肯定是错误的,因为 NULL 指针永远不会被填充。相反,你应该只使用 PyList_Append 和 PyList_Insert 在构建的列表上从空。您也可以调用 list.extend 一次将多个元素添加到列表中 - 无法通过 C API 直接访问该列表,但您可以通过 PyObject_CallMethodObjArgs 或类似方式调用它。
在内部,列表分配的空间比它需要的多,它只需要偶尔重新分配。这是你无法控制的。