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'>
>>>
但还是要谨慎!
我正在尝试以下功能:
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'>
>>>
但还是要谨慎!