请考虑以下代码:
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结合了两个想法 - 它在评估生成器时使用迭代器变量,并且无法检测变量并引发错误。为什么会这样?
答案 0 :(得分:3)
(x == a for x in [0])
这样的genexp创建了自己的范围。eval
内的嵌套作用域未看到eval
使用的本地变量。这意味着在这一行:
print([a for a in [0] if eval("True in (x == a for x in [0])")])
a
内的eval
查找发生在嵌套范围内,因此它不会从a
范围的局部变量中看到eval
变量发生。