PYTHON eval和int之间有什么区别

Che*_*Bin 3 python python-3.x

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

age = eval(input("enter age"))
Run Code Online (Sandbox Code Playgroud)

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

age = int(input("enter age"))
Run Code Online (Sandbox Code Playgroud)

01输入效果很好.为什么?

Fra*_*res 6

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

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


Jea*_*bre 5

eval评估python表达式.在python 3中,0不允许以数字开头的数字(除了0000,请参阅为什么000在Python 3中评估为0?).在python 2中,那些被解释为八进制(基数为8)的数字.不是更好......(python 3 base 8现在只使用Oo前缀)

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

另一个不错的功能是,您可以使用简单且合格的try/except块来检查输入的表达式是否为整数:

while True:
   try:
       age = int(input("enter age"))
       break
   except ValueError:
       print("Retry!")
Run Code Online (Sandbox Code Playgroud)

(eval你必须防止所有例外)

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

注意:上面的代码仍然不安全python 2:input行为就像eval.您可以使用模块开头的简单代码来保护您的代码:

try:
    input = raw_input
except NameError:
    pass
Run Code Online (Sandbox Code Playgroud)

所以python 2 input不再无法访问,raw_input而是调用.Python 3忽略了该代码.

  • 它不仅更安全 - 它也会失败,所以你可以重新尝试,或者如果一个'int`不能产生 - 而不是产生*不是一个*的东西...... (5认同)