2

我运行了以下被认为相同的脚本,但输出完全不同,谁能解释为什么?

我首先导入了必要的模块:

from ctypes import *
import numpy as np 

代码1:

AOVoltage = np.linspace(-1, 1, 2200)
AOVoltage = AOVoltage.ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(1.821347161578237e-284)

代码2:

a = np.linspace(-1, 1, 2200)
AOVoltage = a.ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(-1.0)

代码3:

AOVoltage = (np.linspace(-1, 1, 2200)).ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(1.821347161578237e-284)
4

1 回答 1

4

为此,您需要保留对原始numpy数组的引用,以防止它被垃圾收集。这就是为什么 #2 有效,而 #1 和 #3 无效(它们的行为未定义)。

这在文档中进行了解释:

小心使用该ctypes属性 - 特别是在临时数组或动态构建的数组上。例如,调用(a+b).ctypes.data_as(ctypes.c_void_p)返回一个指向无效内存的指针,因为创建的数组(a+b)在下一个 Python 语句之前被释放。您可以使用c=a+b或避免此问题ct=(a+b).ctypes。在后一种情况下,ct将持有对数组的引用,直到ct被删除或重新分配。

于 2012-11-20T15:47:06.273 回答