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)

Code2:

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)
4

1 に答える 1

4

numpyこれを機能させるには、元の配列への参照を保持して、ガベージコレクションが行われないようにする必要があります。これが、#2が機能し、#1と#3が機能しない理由です(これらの動作は定義されていません)。

これはドキュメントで説明されています:

ctypes特に一時配列またはオンザフライで構築された配列では、属性の使用に注意してください。たとえば、呼び出しは、次のPythonステートメントの前に割り当てが解除(a+b).ctypes.data_as(ctypes.c_void_p)されたように作成された配列のため、無効なメモリへのポインタを返します。または(a+b)を使用して、この問題を回避できます。後者の場合、は削除または再割り当てされるまで配列への参照を保持します。c=a+bct=(a+b).ctypesctct

于 2012-11-20T15:47:06.273 に答える