从C++修改python列表

Moh*_*cuf 4 c++ python ctypes

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

MyPointer = TheList.as_pointer()
Run Code Online (Sandbox Code Playgroud)

现在我用ctypes将这个地址传递给C++

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

*(float*) MyPointer = 2.0f; //for example
Run Code Online (Sandbox Code Playgroud)

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

use*_*342 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 ...
    }
}
Run Code Online (Sandbox Code Playgroud)