Python中eval(“ input()”)和eval(input())之间的区别

时间:2019-03-13 14:38:50

标签: python python-3.x eval

我正在尝试以下功能:

x = eval(input())

将输入设置为123,并且x的类型也为int,效果很好:

In [22]: x=eval(input("enter:"))
enter:123
In [24]: print(type(x))
<class 'int'>

但是在将输入作为abcd输入时,会引发错误:

In [26]: x=eval(input("enter:"))
enter:abcd
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-26-fb0be0584c85> in <module>()
----> 1 x=eval(input("enter:"))

<string> in <module>()

NameError: name 'abcd' is not defined

当我将代码更改为:

x=eval('input()')

工作正常:

In [27]: x=eval('input("enter:")')
enter:abcd

In [28]: print(x)
abcd

但是当输入为123时,x的类型为str而不是int

In [30]: x=eval('input("enter:")')
enter:123

In [31]: print(type(x))
<class 'str'>

2 个答案:

答案 0 :(得分:4)

eval评估一段代码。 input从用户输入中获取字符串。因此:

  • eval(input())会评估用户输入的内容。如果用户输入123,则结果将是一个数字;如果输入"foo",则将是一个字符串;如果输入?wrfs,将产生一个错误。

  • eval("input()")评估字符串"input()",这将导致Python执行input函数。这会要求用户输入一个字符串(没有其他内容),即123将是字符串"123"?wrfs将是字符串"?wrfs"和{{1 }}将是字符串"foo"(!)。

第三个版本可能会带来明显的不同:'"foo"'eval(eval("input()"))完全相同。

答案 1 :(得分:0)

我们不要关注eval(“input()”)eval(input())之间的区别,而要关注它们的主要相似之处:您不应该做任何一个!

我不知道eval(input())习惯用法在Python 3中来自何处,可能是由未学习使用input()的Python 2用户误解了raw_input()的移植,但是避免!

在这种情况下,正确的答案是,如果您想要str,请执行以下操作:

x = input()

如果您想要int,请执行以下操作:

x = int(input())

但是在为潜在用户的各种滥用开放程序时,请停止使用eval()

>>> x = eval(input('enter: '))
enter: __import__("os").system("rm *")
>>> 

不要在家尝试!还是工作!

如果要输入恒定的Python数据结构,则可以尝试通过ast模块中的literal_eval()

>>> from ast import literal_eval
>>> my_dict = literal_eval(input('enter dict: '))
enter dict: {'a': 1, 'b': 2, 'c': 3}
>>> my_dict
{'a': 1, 'b': 2, 'c': 3}
>>> type(my_dict)
<class 'dict'>
>>>  

但仍要小心!