我的C-application正在加载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。任何建议/意见/解决方法?
我的问题的上下文是我需要比列表项及其计数已知的更早地创建列表。
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
或类似方法调用它。
在内部,列表分配的空间超出了它所需的空间,因为它只需要偶尔重新分配。你无法控制它。