我运行了以下脚本,这些脚本被认为是相同的,但输出完全不同, 谁能解释为什么?
我首先导入了必要的模块:
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)
Code3:
AOVoltage = (np.linspace(-1, 1, 2200)).ctypes.data_as(POINTER(c_double))
print AOVoltage.contents
c_double(1.821347161578237e-284)
答案 0 :(得分: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
被删除或重新分配。