为什么 Python 的 eval(input("请输入:")) 会改变输入的数据类型?

9
在Python 3中,我编写了一个简单的命令来接受用户输入的整数,如下所示:
x = int(input("Enter a number: "))

如果我跳过int()部分,仅使用x = input("请输入一个数字:"),那么我的输入数据类型是字符串,而不是整数。我理解这一点。
然而,如果我使用以下命令:
x = eval(input("Enter a number: "))

输入的数据类型是“int”。

为什么会发生这种情况?


当您使用eval()时,可能是动态类型检查吗? - cssGEEK
1
eval 将输入视为代码执行,比如在代码中写x = 3,会创建一个整数对象,因此 x = eval("3") 同样会创建一个整数对象,然而允许用户以任意代码作为输入可能会带来巨大的问题,如果用户输入了 open(__file__,'w').close() ,它会删除当前正在执行的文件。 - Tadhg McDonald-Jensen
2个回答

9

为什么会出现这种情况?

x = eval(input("请输入一个数字:"))x = eval('input("请输入一个数字:")')是两回事。

前者先调用input(...),得到一个字符串,例如'5',然后对其进行求值,这就是为什么您会得到一个int类型的值,具体过程如下:

>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int

后者(更符合您的预期)评估表达式'input("输入数字:")'

>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x 
'5' # Here you get a str

0
因为在Python中,数字是一个有效的表达式,它会被计算为它本身(类型为int)。例如,如果您输入一个无效的字符串,其中包含一个不存在的变量名(比如'abcdefgh'),那么就会引发一个NameError异常(这个异常是在计算表达式时引发的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接