从python列表转换为char **并返回使Cython中的所有元素都相同

时间:2016-07-16 04:56:55

标签: cython

我有一个名为test.pyx的Cython文件,其中包含以下代码:

from libc.stdlib cimport malloc, free
def test():
    x = ["a1", "a2", "a3"]
    cdef char** y = <char**> malloc(len(x) * sizeof(char*))
    for i in range(len(x)):
        item_uni = x[i].encode("UTF-8")
        y[i] = item_uni
    z = []
    for i in range(len(x)):
        item = y[i]
        z.append(item)
    print(z)

该功能应该看似打印["a1", "a2", "a3"]。但是,它给了我三个"a3"的实例:

>>> test()
[b'a3', b'a3', b'a3']

为什么会这样?

1 个答案:

答案 0 :(得分:2)

这是因为涉及临时对象。 item_uni内容可能始终具有相同的内存地址,y[i] = item_uni将指向所有项目的相同地址,并且由于最后一个字符串是“a3”,因此将有三次“a3”

strdup应该修复它(那时需要free

from libc.string cimport strdup
...    
        y[i] = strdup(item_uni)