【问题标题】:Python - exec(expression, globals=None, locals=None)Python - 执行(表达式,全局 = 无,本地 = 无)
【发布时间】:2014-03-19 22:31:39
【问题描述】:

我了解 eval 的基本用法,如 Python 标准库中的示例所示:

x = 1
print(eval('x+1'))
2

有人可以提供更简洁的解释,并提供使用全局和局部参数的示例。

【问题讨论】:

  • 修正了问题,很好。
  • 一般来说,不要使用execeval,除非您完全知道自己在做什么并且确信使用它是解决问题的最佳方法。 execeval 通常应该不惜一切代价避免,因为它们会带来许多问题:当用于用户输入时,它们几乎是无法解决的安全隐患,可能会大大降低您的代码速度(因为 exec 可以操纵本地人,它会主动关闭对使用范围内的局部变量的优化),引入难以发现的错误,重构麻烦,降低可读性等等......

标签: python python-3.x eval standard-library


【解决方案1】:

如果您指定全局、局部命名空间,它们将用于全局、局部变量而不是当前范围。

>>> x = 1
>>> d = {'x': 9}
>>> exec('x += 1; print(x)', d, d) # x => 9 (not 1)
10

注意:字典外的x 不受影响。

>>> x
1
>>> d['x']
10

【讨论】:

    【解决方案2】:

    globalslocals 允许您定义eval 应该在其中运行的范围,即在尝试评估表达式时应该可以使用哪些变量。例如:

    >>> eval("x * 2", {'x': 5, 'y': 6}, {'x': 4})
    8
    

    注意x在本地全局范围内,使用本地版本。

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多