如果您使用的是 Python 3,这是@falsetru 答案的更新(未经 Python 2 测试)。
cdef extern from "Python.h":
char* PyUnicode_AsUTF8(object unicode)
from libc.stdlib cimport malloc, free
from libc.string cimport strcmp
cdef char ** to_cstring_array(list_str):
cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
for i in xrange(len(list_str)):
ret[i] = PyUnicode_AsUTF8(list_str[i])
return ret
def foo(list_str1, list_str2):
cdef unsigned int i, j
cdef char **c_arr1 = to_cstring_array(list_str1)
cdef char **c_arr2 = to_cstring_array(list_str2)
for i in range(len(list_str1)):
for j in range(len(list_str2)):
if i != j and strcmp(c_arr1[i], c_arr2[j]) == 0:
print(i, j, list_str1[i])
free(c_arr1)
free(c_arr2)
foo(['hello', 'python', 'world'], ['python', 'rules'])
警告:返回的指针PyUnicode_AsUTF8
缓存在父 unicode 对象中。这有两个后果:
- 此指针仅在父 unicode 对象存在时才有效。之后访问它会导致未定义的行为(例如可能的分段错误)。
- 的调用者
PyUnicode_AsUTF8
不负责释放内存。