PYTHON eval和int之间有什么区别

PYTHON what is the difference between eval and int

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

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

在输入过程中,我输入01是一个错误,但当我编码时

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

01作为输入工作完美。为什么会这样?


eval计算python表达式。在python 3中,不允许使用以0开头的数字(除了0000之外,请参见为什么在python 3中000的值为0?)在python 2中,这些数字被解释为八进制(以8为基数)数字。不是更好…(python 3 base 8现在只使用Oo前缀)

int执行字符串到整数的转换,因此它不能计算复杂的表达式(您不需要),但不受此前导零语法的约束。

另一个不错的特性是,您可以使用简单且限定的try/except块检查输入的表达式是否为整数:

1
2
3
4
5
6
while True:
   try:
       age = int(input("enter age"))
       break
   except ValueError:
       print("Retry!")

(使用eval时,您必须保护自己不受任何例外情况的影响)

建议:使用int,因为它更安全,不存在安全问题(eval可以评估任何表达式,包括系统调用和文件删除),完全符合您的目的。

注意:上面的代码对于python 2仍然不安全:input的行为与eval类似。您可以使用模块开头的简单代码来保护您的代码不受此影响:

1
2
3
4
try:
    input = raw_input
except NameError:
    pass

所以python 2 input不再是不可访问的,而是调用raw_input。python 3忽略该代码。


eval()用于验证表达式。除八进制数(以0开头的数)外,on数被视为一个表达式。int()处理字符串到整数的转换。您应该避免使用eval()的原因有很多。记住:

    百万千克1

    Python2.x

    1
    x = raw_input('Enter number here: ')

    百万千克1百万千克1

    Python3.x

    1
    x = input('Enter number here: ')

    。百万千克1百万千克1

    Python2.x安全风险:

    1
    x = input('Enter number here: ')

    。百万千克1百万千克1

    Python3.x安全风险:

    1
    x = eval(input('Enter number here: '))

    。百万千克1

另外,请记住,eval()有可能运行代码,这可能会造成巨大的安全风险。我建议您不要使用它,除非您清楚地知道自己在做什么,否则它可能会损害您的应用程序。