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

Difference between eval("input()") and eval(input()) in Python

我正在尝试以下功能:

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'>

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

  • eval(input()) 计算用户输入的任何内容。如果用户输入 123,结果将是一个数字,如果他们输入 "foo",结果将是一个字符串,如果他们输入 ?wrfs,则会引发错误。

  • eval("input()") 计算字符串 "input()",这导致 Python 执行 input 函数。这要求用户提供一个字符串(没有别的),即 123 将是字符串 "123"?wrfs 将是字符串 "?wrfs",而 "foo" 将是字符串 '"foo"' (!).

第三个版本可能会使差异变得明显:eval(eval("input()"))eval(input()) 完全相同。

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

不知道Python3中的eval(input())习语从何而来,可能是Python2个没学过的用户误移植了input()改为使用 raw_input(),但要避免使用!

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

x = input()

如果您想要 int,请执行:

x = int(input())

但是停止使用 eval(),因为您正在为潜在用户的各种滥用打开您的程序:

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

不要在家里尝试这个!或者工作!

如果你想输入常量Python数据结构,你可以尝试literal_eval()来自ast模块:

>>> 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'>
>>>  

但还是要谨慎!