我正在尝试将eval
与字典中的变量一起使用,因此设置非常简单:
d = {"x": 0}
e = "x**2"
v = eval(e, d)
然而,出于某种原因,这会通过添加额外的密钥来破坏字典,使其变得毫无用处:
print(d)
>>> {'x': 0, '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", (...)
这是eval
的“预期”行为,但这似乎就像一个错误。那么在不破坏字典的情况下,使用eval
使用字典键/值的最pythonic方式是什么?
答案 0 :(得分:1)
我不宽恕使用eval
,但......
如果您不希望d
发生变异,那么传递一份副本怎么样?
>>> d = {"x": 0}
>>> e = "x**2"
>>> v = eval(e, d.copy())
>>> d
{'x': 0}
答案 1 :(得分:1)
eval
似乎只会修改参数pass以用作全局变量而不是本地变量。
>>> eval(e, None, d)
0
>>> d
{'x': 0}
来自文档:
如果全局字典存在且缺少
__builtins__
,则在解析表达式之前,会将当前全局变量复制到全局变量中。