PYTHON eval和int之间有什么区别

时间:2017-08-25 12:34:01

标签: python python-3.x

之前我听说eval(input(a))会自动将字符串转换为int,但如果我编码

age = eval(input("enter age"))

在输入期间我输入01这是一个错误,但当我编码

age = int(input("enter age"))

01,输入效果很好。为什么?

2 个答案:

答案 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()有可能运行代码,这可能会导致巨大的安全风险。我建议不要使用它,除非你清楚地知道你正在做什么,否则它可能会损害你的申请。