【问题标题】: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_AppendPyList_Insert 在构建的列表上从空。您也可以调用 list.extend 一次将多个元素添加到列表中 - 无法通过 C API 直接访问该列表,但您可以通过 PyObject_CallMethodObjArgs 或类似方式调用它。

    在内部,列表分配的空间比它需要的多,它只需要偶尔重新分配。这是你无法控制的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 2012-10-19
      • 1970-01-01
      • 2012-03-11
      • 2021-11-27
      • 2021-12-27
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多