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

2024-10-03 23:21:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一系列名称相似的数组mccdata.rho0, mccdata.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”数组。在

^{pr2}$

但是eval命令出错:

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

如何遍历现有数组并更新它们的值? 或 如何通过名称标识数组以便更新它们?在


Tags: 名称evalnp数组读取数据rhorho0names1
1条回答
网友
1楼 · 发布于 2024-10-03 23:21:26

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

尽管Python提供了eval,但它也提供了许多其他的东西,通常不需要{}。对于您的代码,Python提供^{}。你给它一个对象、一个对象的属性名和一个值,然后它指定该对象的属性来引用给定的值。在

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

它也可以使代码更具可读性,从而去掉names1部分。我可以这样写代码:

^{pr2}$

这样,我就可以很清楚地分配对象的rho相关属性,而不必去查看names1列表中的内容;名称names1并没有提供关于其中内容的太多信息。在

相关问题 更多 >