a='''b="ddd"'''
eval(repr(a))
print str(a)
print b
请尽量使用代码,而不是文字,因为我的英语不是很好,谢谢为什么我的“EVAL”功能不工作,我认为它可以打印“B”,而不是
a='''b="ddd"'''
eval(repr(a))
print str(a)
print b
请尽量使用代码,而不是文字,因为我的英语不是很好,谢谢为什么我的“EVAL”功能不工作,我认为它可以打印“B”,而不是
用途:
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
的赋值,而是字符串的评估。
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
显然7=d
不是有效的Python,但'7=d'
是,由于以上原因解释。
的expr()
,repr()
和compile()
内置插件的描述,足以足以工作了这一点,发现here。在做出这个答案的过程中,没有任何内建损害。
重新考虑您是否确实需要使用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
参见:http://docs.python.org /reference/simple_stmts.html#exec – Miles 2009-12-24 07:40:52