我正在尝试以下功能:
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'>
答案 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'>
>>>
但仍要小心!