gpt4 book ai didi

c++ - 从 C++ 修改 python 列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:30 36 4
gpt4 key购买 nike

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

MyPointer = TheList.as_pointer()

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

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

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

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

最佳答案

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

要更改列表,请查看 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 ...
}
}

关于c++ - 从 C++ 修改 python 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15833715/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com