【发布时间】:2016-12-19 16:15:47
【问题描述】:
为什么 Python 的 eval 不能在函数内工作?相同的eval(compile(cmd)) 代码在全局环境中有效,但在foo 函数内部无效。
简单示例:
fn = '/tmp/tmp'
mode = 'single'
def foo(cmd, fn, mode):
eval(compile(cmd, fn, mode)) # <<< this does not work
print 'foo: cmd=', cmd
print 'foo: x=', x
cmd = "x = 1"
eval(compile(cmd, fn, mode)) # <<< this works
print 'global scope: cmd=', cmd
print 'global scope: x=', x
del(x)
foo('x = 9', fn, mode)
这是输出和错误信息:
global scope: cmd= x = 1
global scope: x= 1
foo: cmd= x = 9
foo: x=
Traceback (most recent call last):
File "ctest.py", line 20, in <module>
foo('x = 9', fn, mode)
File "ctest.py", line 12, in foo
print 'foo: x=', x
NameError: global name 'x' is not defined
【问题讨论】:
-
您确定不想将其值分配给某个东西吗?
-
刚试过这个:
x最终出现在locals字典中,就像它对exec所做的那样,但是虽然exec(cmd)在函数中起作用,eval(compile(...))却没有。 -
另外,如果你在
print 'foo: x=', x中输入eval("x")而不是x,它也可以工作。 Python 2.7 和 Python 3.4 中的行为相同
标签: python function global-variables exec eval