Python,使用已定义的函数循环,但输出奇怪的值

时间:2017-12-19 17:38:57

标签: python python-2.7

我定义了一个函数,EmiCtrypercapitayear是全局参数。我希望看到选择不同shresholdramprate的效果。

def annual_emi_scale(shreshold, ramprate):
    tmp = EmiCtry
    for i in range(177):
        for j in range(91):
            if percapita[i,j] >= shreshold and year[j] >= 2020:
                tmp[i,j] = tmp[i,j] * (1.-ramprate)
    adj1 = cdutil.averager(tmp, axis=0,weights='equal',action='sum')
    adj2 = cdutil.averager(adj1,axis=0,weights='equal',action='sum')
    return adj1, adj2

然后我用定义的函数做一个循环:

emi  = np.zeros([25, 91]) 
cum  = np.zeros([5,5])
for ii in range(5):
    shre = (ii + 1) * 20
    for jj in range(5):
        ramp = jj * 0.02
        emi[ii*5+jj],cum[ii,jj] =  annual_emi_scale(shre, ramp)

ii>的输出很奇怪0并且似乎在每个循环tmp = EmiCtry完全不起作用之后。也就是说,对于ii = 3tmp = EmiCtry将在ii = 2时使用tmp的值。

但是,当我在循环之前tmp1, tmp2 = annual_emi_scale(80, 0.00)时,结果是正确的。但是当我把它放在循环之后,同样的事情再次发生。

EmiCtry是根据其他数据计算得出的,是numpy.array(),其浮动类型值为:co2EmiCtry = original_data.astype(np.float)

1 个答案:

答案 0 :(得分:1)

您需要复制数组EmiCtry,以防止tmp上的修改影响原始数据。

您的行tmp = EmiCtry只是将名称tmp绑定到EmiCtry指向的同一对象。两个名称都指向内存中的相同位置。如果你修改一个,另一个也将被修改。

要制作数组的独立副本,请使用tmp = numpy.copy(EmiCtry)