python - eval 在评估生成器时未能检测到迭代变量

标签 python python-3.x generator

考虑以下代码:

print([a for a in [0] if eval("a in [0]")])
b = 0
print([b if eval("True in (x == b for x in [0])") else ''])
print([a for a in [0] if eval("True in (x == a for x in [0])")])

这个的输出是:

[0]
[0]
Traceback (most recent call last):
  File "…", line 4, in <module>
    print([a for a in [0] if eval("False in (x == a for x in [0])")])
  File "…", line 4, in <listcomp>
    print([a for a in [0] if eval("False in (x == a for x in [0])")])
  File "<string>", line 1, in <module>
  File "<string>", line 1, in <genexpr>
NameError: name 'a' is not defined

第一个 eval 在普通 eval 中使用迭代器 a,并且它有效。

第二个 eval 在计算生成器时使用了一个静态变量 b,并且它起作用了。

第三个 eval 结合了这两个想法 - 它在计算生成器时使用迭代器变量,并且未能检测到该变量并引发错误。为什么会这样?

最佳答案

  • genexp,如 (x == a for x in [0]),创建自己的作用域。
  • 列表理解也是如此,至少在 Python 3 中是这样。
  • eval 中的嵌套范围看不到用于 eval 的本地变量。

这意味着在这一行中:

print([a for a in [0] if eval("True in (x == a for x in [0])")])

eval 中的 a 查找发生在嵌套范围内,因此它不会从局部变量中看到 a 变量eval 发生的范围。

关于python - eval 在评估生成器时未能检测到迭代变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45224140/

相关文章:

python - Python 中的元编程 - 添加对象方法

python - 安装 Flask - 结构

python - zeromq 持久化模式

python-3.x - 带有随机森林的 GridsearchCV

python - 使用 0.8.8+ 版本在页眉或页脚中添加页码

python - 对生成器使用前瞻

python - 如何从 OSX Leopard 卸载 python 以便可以使用 MacPorts 版本?

python-3.x - 使用Python捕获屏幕/窗口内容

python - 列表理解中的捕获和 yield

python - start_request 方法中的 Scrapy yield 响应对象