在python中使用全局变量/ lambda函数时指针无效?

时间:2013-03-05 14:20:13

标签: python pointers memory lambda

我遇到了一个奇怪的错误,我真的不确定是什么导致它。

我有一个包含lambda函数的列表,我已将此列表设置为全局变量,如下所示。然后使用所需的函数输入在“残差”函数内引用全局变量。

from numpy import array

from math import exp

from guppy import hpy   
hp = hpy()
hp.setrelheap()

rate_array = [[0, "4.91*(10**-22)*(T_m**4)"],                                                
              [1, "1.4*(10**-18)*(T_m**0.928)*exp(-T_m/16200)"]]  

global k

k = [0,0]

for i in range(0,2):

    k[i] = (eval('lambda T_m,T_r,Z_initial: ' + rate_array[i][1]))


def residual(t,y,yd):

    Z_initial = 10

    res_0 = -k[1](y[2],y[3], Z_initial)*y[0]
    res_1 = -k[0](y[2],y[3],Z_initial)*y[1]

    return array([res_0,res_1 ])



y = [0,0,0,0]
yd= [0,0,0,0]
t=0

residual(t,y,yd)


print("\nMemory statistics are as follows:\n")
print hp.heap()

运行残差函数似乎会产生无效指针错误或分段错误。代码会不时地运行,但大部分时间都没有。我没有看到代码有什么问题,所以我不知道发生了什么。有什么明显的明显吗?

EXTRA:我意识到这是一种奇怪的方式,但要解释一下:“rate_array”包含字符串,因为它是pickled / unpickled,具体取决于用户是否想要编辑它。

剩余功能也由第三方软件集成,它只允许显示3个输入,所以我不能像往常一样将数组作为输入传递给函数。我也不能将它包含在rate_array中,因为它不会将lambda函数作为可接受的类型。

正常情况下,lambda函数/表达式可能只是在剩余函数本身,只是额外的代码行,但是在代码运行之前用户无法编辑它们......它真是一团糟!

编辑:道歉,我大量减少了代码,试图让它更容易解释,但在这个过程中只输入了一些错误的东西,现在已经纠正了。

错误代码:

*** glibc detected *** python: free(): invalid pointer: 0x0000000002a7aa50 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fd857ddbb96]
/usr/local/lib/python2.7/dist-packages/guppy/sets/setsc.so(+0xbeeb)[0x7fd841bd1eeb]
/usr/local/lib/python2.7/dist-packages/guppy/sets/setsc.so(+0xbf73)[0x7fd841bd1f73]
python[0x48abf9]
python[0x48a9de]
python(PyEval_EvalFrameEx+0x52c)[0x45fb2c]
python(PyEval_EvalFrameEx+0xcb7)[0x4602b7]
python(PyEval_EvalCodeEx+0x199)[0x467209]
python(PyEval_EvalCode+0x32)[0x4d0242]
python[0x5102bb]
python(PyRun_FileExFlags+0x9a)[0x44a466]
python(PyRun_SimpleFileExFlags+0x2bc)[0x44a97a]
python(Py_Main+0xb36)[0x44b6bc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fd857d7e76d]
python[0x4ce0ad]

0 个答案:

没有答案