为什么我的“eval”函数不工作,我认为它可以打印'b',但没有打印

0 投票
3 回答
1403 浏览
提问于 2025-04-15 17:20
a='''b="ddd"'''
eval(repr(a))
print str(a)
print b

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

3 个回答

0

再想想你是否真的需要使用 eval() 这个东西。比如,你可以像这样使用 globals()

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

不过,也许你更应该使用一个字典

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

eval 是用来计算一个表达式的,也就是得到它的结果。如果你想要动态执行 Python 代码,可以使用 exec

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

另外要注意的是,在把字符串传给这两个函数之前,不要先调用 repr()。因为你已经有了一个字符串,调用 repr() 会生成一个字符串的字符串表示,这样反而多余了。

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() 这些内置函数的描述,足够让你理解这些内容,可以在 这里 找到。在这个回答的过程中,没有任何内置函数受到伤害。

撰写回答