我运行了以下脚本,它们被认为是相同的,但是输出完全不同,
有人能解释为什么吗?
我首先导入了必要的模块:

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+bct=(a+b).ctypes来避免此问题。在后一种情况下,ct将保留对数组的引用,直到删除或重新分配ct为止。

关于python - 等效的numpy脚本产生不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13476669/

10-14 00:01