4

我有一个 Python 列表,我可以获取它的指针并将这个指针地址传递给 C++ 来处理

MyPointer = TheList.as_pointer()

现在我使用 ctypes 将此地址传递给 C++

在 C++ 中,我可以执行以下操作:

*(float*) MyPointer = 2.0f; //for example

并且 Python 值会立即更新,现在的问题是:如何扩展或删除一些值(比如直接从 C++ 修改列表),因为我觉得这些数据是std::vector如何做push_back的等等,以快速调整大小(因为在 Python 中迭代非常慢)

4

1 回答 1

6

仅给定该指针,您无法扩展列表。您传递给 C++ 的是内部用于实现 Python 列表的数组的地址。这不能是std::vector,因为 Python 列表不是作为 STL 向量实现的,而是作为 Python 对象引用的 C 级数组实现的。这些数组不包含指向 Python 列表对象的反向指针。

要更改列表,请查看文档并将您的 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 ...
    }
}
于 2013-04-05T12:25:54.817 回答