使用eval与字典值而不破坏字典?

时间:2017-09-21 17:58:04

标签: python dictionary eval

我正在尝试将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方式是什么?

2 个答案:

答案 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__,则在解析表达式之前,会将当前全局变量复制到全局变量中。