如何给Python中eval函数的输出赋值

0 投票
2 回答
2121 浏览
提问于 2025-04-18 01:40

我试着给 eval 函数的输出赋值,像这样:

d = {"a": 10}
st1 = 'd'
st2 = '["a"]'
eval(st1 + st2) = 15

结果我遇到了这个错误:

File "<stdin>", line 1
SyntaxError: can't assign to function call

我还试过这样:

x = eval(st1 + st2)
x = 15

但是这并没有改变 d 字典。我还尝试把整个赋值都用 eval 处理,像这样:

eval(st1 + st2 + ' = 15')

但我又遇到了这个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
  d["a"] = 15
         ^
SyntaxError: invalid syntax

我也试过使用 ast.literal_eval() 函数,结果都是一样的。那么,有没有办法解决这个问题呢?

编辑 1:

为了澄清 @LennartRegebro 要求的内容,我想说我有一些字典,里面有特定的键值对。我有一个文本文件是用户提供的,里面定义了一些值,我需要把基本字典的值改成这些用户定义的值。我有一个解析器,可以解析这个文本文件,对于每个需要更改的地方,它会给我一个包含字典名称、键和值的元组;这些都是字符串。我想用 eval 函数来进行赋值,但我明白我不能这样做。

编辑 2:

根据 @lejlot 的建议,我使用了 globals() 并在我的代码中添加了以下几行:

import re
pattern = re.compile(r'\["([A-Za-z0-9_\./\\-]+)"\]')
globals()[st1][pattern.findall(st2)[0]] = 15

2 个回答

0

做一个简单的,

exec(st1 + st2 + '= 15')

eval 是不行的。要用 exec。而且赋值操作应该在参数内部完成。

不过,使用 exec 是非常不推荐的做法。

3

你为什么不通过 globals()(或者 locals())来访问你的变量,而是用 eval 呢?

d={'a':10}
globals()['d']['a']=15
print d['a']

在你的具体情况下

d={'a':10}
s1='d'
s2='a'
globals()[s1][s2]=15
print d['a']

撰写回答