我已经编写了一个名为SortInPlace
的C函数,该函数可以对整数数组进行排序。现在,我想从Python调用它。以下是我的代码的核心:
def sort_in_place(vs):
buffer = (c_void_p * len(vs))(*vs)
lib.SortInPlace.argtypes = [c_void_p]
lib.SortInPlace.restype = None
lib.SortInPlace(buffer)
print "buffer: ", buffer
vs = [3,2,1]
sort_in_place(vs)
print "vs: ", vs
但是结果却是
buffer: 1,2,3
vs: 3,2,1
我打印了buffer
和vs
的地址,表明它们的存储地址不同。因此,buffer
被排序到位,而vs
未被修改。
我还尝试使用array
通过以下方式将vs
转换为指针:
from array import array
a = array('l',vs)
# however, their addresses are also different
print hex(id(vs))
print hex(a.buffer_info()[0])
在两种情况下,原始的vs
总是被复制到新的内存缓冲区。我的问题是:如何直接从Python列表对象的地址创建缓冲区而不进行复制?