为什么我的“eval”功能不起作用,我认为它可以打印'b',但不是

时间:2009-12-24 06:45:45

标签: python eval exec

a='''b="ddd"'''
eval(repr(a))
print str(a)
print b

请尝试使用代码,而不是文字,因为我的英语不是很好,谢谢

3 个答案:

答案 0 :(得分:3)

使用:

eval(compile(a,'<string>','exec'))

而不是:

eval(repr(a))

文稿:

>>> a='''b="ddd"'''
>>> eval(compile(a,'<string>','exec'))
>>> print str(a)
b="ddd"
>>> print b
ddd

问题在于您实际执行的语句'b="ddd"'不是b的赋值,而是对字符串的求值。

{1}}内置函数,在给定字符串时,将其计算为表达式(不是语句)并返回结果。您可以通过为代码对象提供eval()来运行非表达式代码,我们使用上面的eval()创建代码对象。在这种情况下,它运行代码并返回compile()

如果您输入以下内容,您可以看到类似的效果:

None

显然>>> 'c=7' 'c=7' >>> c Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'c' is not defined >>> c=7 >>> c 7 >>> '7=d' '7=d' >>> 7=d File "<stdin>", line 1 SyntaxError: can't assign to literal 不是有效的Python,但7=d是由于上面解释的原因。

'7=d'expr()repr()内置插件的说明已经找到here,足以解决这个问题。在做出这个答案时,没有任何内置插件受到伤害。

答案 1 :(得分:2)

eval用于评估(获得结果)表达式。你想要的是动态执行Python代码,这是通过exec完成的:

>>> a='''b="ddd"'''
>>> exec(a)
>>> print b
ddd

另请注意,在将字符串传递给任一函数之前,不应调用repr()。你已经有了一个字符串,调用repr()会创建一个字符串的字符串表示。

答案 2 :(得分:0)

重新考虑您是否真的需要使用eval()。例如,您可以像这样使用globals()

>>> globals()['b'] = 'ddd'
>>> print b
ddd

但也许您应该使用的只是 dictionary

>>> my_namespace = dict()
>>> my_namespace['b'] = 'ddd'
>>> my_namespace
{'b': 'ddd'}
>>> print my_namespace['b']
ddd