为什么我的“eval”函数不工作,我认为它可以打印'b',但没有打印
a='''b="ddd"'''
eval(repr(a))
print str(a)
print b
请尽量使用代码,而不是文字,因为我的英语不是很好,谢谢
3 个回答
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
赋值,而是在评估这个字符串。
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()
这些内置函数的描述,足够让你理解这些内容,可以在 这里 找到。在这个回答的过程中,没有任何内置函数受到伤害。