【发布时间】:2018-05-17 09:20:55
【问题描述】:
我是python的初学者。在解决 Think Python 一书中的练习时发现了这一点。在此代码中,eval_loop 函数迭代地提示用户,获取结果输入并使用 eval 对其进行评估,然后打印结果。 它应该一直持续到用户输入“完成”,然后返回它评估的最后一个表达式的值。我的疑问是:
Eval 必须有一个字符串作为它的参数,但是即使我们输入 5+4 这样的非字符串,这段代码也能工作,它会打印 9。由于我们没有在任何地方将输入转换为字符串,请告诉我它是怎么回事产生错误?
def eval_loop():
result=0
while True:
s = input('>>>')
if s == 'done':
break
result = eval(s)
print(result)
print(result)
eval_loop()
更新:
好的,我现在明白了,函数输入返回一个字符串。但现在我又多了一个疑问:
如果输入函数返回一个字符串,那么为什么当我将输入作为 - hello 时它会产生错误,而它周围没有任何引号。它给出了 NameError: name 'hello' is not defined。如果输入返回一个字符串,hello不应该也转换为字符串吗?
请有人帮帮我,这变得非常混乱。 :(
【问题讨论】:
-
input返回一个字符串。 -
在python 2中它也可以工作,因为
eval包含在input中 -
5+4 有效,因为
eval评估表达式...我推荐simpleeval代替(外部包),它没有任何安全问题... -
@preetikamondal - 输入
hello被转换为来自input()的字符串,但是当您尝试将eval()字符串作为变量进行评估时(例如eval("hello"))和因为您没有定义hello变量,所以您会收到错误消息。 -
@preetikamondal - “反逗号”,你的意思是你的输入用单引号括起来?那么你告诉Python它是一个字符串(相当于
eval("'hello'"),所以它不会试图找到一个具有这样名称的变量。想想eval(),就好像你真的在输入代码——如果你输入你的代码@987654334 @ 什么都不会发生(它是一个字符串文字,所以它只会被忽略,因为它没有分配给任何东西)但是如果你输入hello它会尝试找到一个名为hello的变量并引发NameError。
标签: python python-3.x