我在 Python 3 中遇到了奇怪的 eval 行为 - 当在列表理解中调用 eval 时,不会拾取局部变量。
def apply_op():
x, y, z = [0.5, 0.25, 0.75]
op = "x,y,z"
return [eval(o) for o in op.split(",")]
print(apply_op())
Python 3 中出现错误:
▶ python --version
Python 3.4.3
▶ python eval.py
Traceback (most recent call last):
File "eval.py", line 7, in <module>
print(apply_op())
File "eval.py", line 5, in apply_op
return [eval(o) % 1 for o in op.split(",")]
File "eval.py", line 5, in <listcomp>
return [eval(o) % 1 for o in op.split(",")]
File "<string>", line 1, in <module>
NameError: name 'x' is not defined
它在 Python 2 中运行良好:
▶ python --version
Python 2.7.8
▶ python eval.py
[0.5, 0.25, 0.75]
将其移到列表理解之外可以消除该问题。
def apply_op():
x, y, z = [0.5, 0.25, 0.75]
return [eval("x"), eval("y"), eval("z")]
这是预期的行为,还是一个错误?