我有一个Python列表,我可以获取它的指针,并将此指针地址传递给C ++以便
MyPointer = TheList.as_pointer()
现在我使用ctypes
将此地址传递给C ++在C ++中我可以执行以下操作:
*(float*) MyPointer = 2.0f; //for example
并且Python值会立即更新,现在的问题是:
如何扩展或删除一些值(比如直接从C ++修改列表)
因为我觉得这些数据是std::vector
如何做push_back
等等以快速的方式调整大小(因为Python中的迭代几乎是缓慢的)
答案 0 :(得分:6)
仅指定该指针,您无法扩展列表。传递给C ++的是内部用于实现Python列表的数组的地址。这不能是std::vector
,因为Python列表不是作为STL向量实现的,而是作为Python对象引用的C级数组实现的。这些数组不包含Python列表对象的backpointer。
要改变列表,请查看the documentation并将您的C ++代码与Python库链接。如果你真的必须从ctypes调用你的C ++函数,用列表的id
调用它来获取指向列表的指针,而不是它的元素数组。然后你可以像这样操作列表:
#include <Python.h>
extern "C"
void append_to_list(uintptr_t lst_id)
{
PyObject* lst = reinterpret_cast<PyObject*>(ptr);
PyObject* new_num = PyFloat_FromDouble(2.0);
if (!new_num) {
... PyFloat creation failed ...
}
int ret = PyList_Append(lst, new_num);
Py_DECREF(new_num);
if (ret) {
... PyList_Append failed ...
}
}