我运行了以下脚本,它们被认为是相同的,但是输出完全不同,
有人能解释为什么吗?
我首先导入了必要的模块:
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)
最佳答案
为此,需要保留对原始numpy
数组的引用,以防止其被垃圾收集。这就是为什么2起作用,而1和3不起作用(他们的行为没有定义)。
这在documentation中有解释:
小心使用ctypes
属性-特别是在临时数组或动态构造的数组上。例如,调用(a+b).ctypes.data_as(ctypes.c_void_p)
返回一个指向内存的指针,该指针无效,因为创建为(a+b)
的数组在下一条Python语句之前被释放。您可以使用c=a+b
或ct=(a+b).ctypes
来避免此问题。在后一种情况下,ct
将保留对数组的引用,直到删除或重新分配ct
为止。
关于python - 等效的numpy脚本产生不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13476669/