在Python中使用eval为数组赋值?

时间:2015-09-02 19:00:57

标签: python arrays eval

我有一系列具有相似名称的数组mcmcdata.rho0,mcmcdata.rho1,...我希望能够在更新它们的值时循环遍历它们。我无法弄清楚如何做到这一点,甚至可能会被称为这样的事情。

我从文件中读取了我的数据:

names1='l b rho0 rho1 rho2 rho3 rho4 rho5 rho6 rho7 rho8 rho9 rho10 rho11 rho12 rho13 rho14 rho15 rho16 rho17 rho18 rho19 rho20 rho21 rho22 rho23'.split()
mcmcdata=np.genfromtxt(filename,names=names1,dtype=None).view(np.recarray)

我想在稍后进行一些计算后更新“rho”数组。

for jj in range(dbins):

    mcmc_x, mcmc_y, mcmc_z = wf.lbd_to_xyz(mcmcdata.l,mcmcdata.b,d[jj],R_sun)

    rho, thindisk, thickdisk, halo = wf.total_density_fithRthinhRthickhzthinhzthickhrfRiA( mcmc_x, mcmc_y, mcmc_z, R_sun,params)

    eval("mcmcdata."+names1[2+jj]) = copy.deepcopy(rho)
    eval("mcmcthin."+names1[2+jj]) = copy.deepcopy(thindisk)
    eval("mcmcthick."+names1[2+jj]) = copy.deepcopy(thickdisk)
    eval("mcmchalo."+names1[2+jj]) = copy.deepcopy(halo)

但是eval命令发出错误:

File "<ipython-input-133-30322c5e633d>", line 13
    eval("mcmcdata."+names1[2+jj]) = copy.deepcopy(rho)
SyntaxError: can't assign to function call

如何循环现有数组并更新其值? 要么 如何通过名称识别数组,以便我可以更新它们?

1 个答案:

答案 0 :(得分:1)

eval命令不会像您认为的那样工作。您似乎正在使用它像文本替换宏,希望Python将读取给定的字符串,然后假装您在原始源代码中编写该文本。相反,它接收一个字符串,然后执行该代码。你给它一个引用一个对象属性的表达式,这很好,但是评估该表达式的结果不会产生你可以分配给它的东西。它产生该属性的

虽然Python提供了eval,但它还提供了许多其他通常不需要eval的东西。对于您的代码,Python提供setattr。你给它一个对象,该对象上属性的名称和一个值,并赋予该对象的属性以引用给定的值。

setattr(mcmcdata, names1[2+jj], copy.deepcopy(rho))

可能使代码更具可读性,以摆脱names1部分。我可能会写这样的代码:

setattr(mcmcdata, 'rho' + str(jj), copy.deepcopy(rho))

这样,我很清楚,我不必去查看names1列表中的内容,而是分配对象的rho相关属性;名称​​ names1 并没有提供有关其中的内容的大量信息。