之前我听说eval(input(a))
会自动将字符串转换为int,但如果我编码
age = eval(input("enter age"))
在输入期间我输入01这是一个错误,但当我编码
age = int(input("enter age"))
01,输入效果很好。为什么?
答案 0 :(得分:5)
eval
评估python表达式。在python 3中,不允许以0
开头的数字(0000
除外),请参阅Why does 000 evaluate to 0 in Python 3?)。在python 2中,那些被解释为八进制(基数为8)的数字。不是更好......(python 3 base 8现在只使用Oo
前缀)
int
执行字符串到整数转换,因此无法计算复杂表达式(您不需要),但不受此前导零语法的影响。
另一个不错的功能是,您可以使用简单且合格的try/except
块来检查输入的表达式是否为整数:
while True:
try:
age = int(input("enter age"))
break
except ValueError:
print("Retry!")
(使用eval
您必须防止所有异常)
建议:使用int
,因为它更安全,没有安全问题(eval可以评估任何表达式,包括系统调用和文件删除),并且完全符合您的目的。
注意:上面的代码对于python 2仍然不安全:input
就像eval
一样。您可以使用模块开头的简单代码来保护您的代码:
try:
input = raw_input
except NameError:
pass
所以python 2 input
不再无法访问,而是调用raw_input
。 Python 3忽略了该代码。
答案 1 :(得分:1)
eval()
用于验证表达式。数字被认为是一个表达式,除了八进制数(以0开头的数字)。 int()
处理字符串到整数的转换。您应该避免使用eval()
的原因有很多。请记住:
Python 2.x
x = raw_input('Enter number here: ')
Python 3.x
x = input('Enter number here: ')
Python 2.x
安全风险:
x = input('Enter number here: ')
Python 3.x
安全风险:
x = eval(input('Enter number here: '))
另外,请记住eval()
有可能运行代码,这可能会导致巨大的安全风险。我建议不要使用它,除非你清楚地知道你正在做什么,否则它可能会损害你的申请。