"eval"和"int"之间有什么区别?

7

之前我听说eval(input(a))会自动将一个字符串转换为整数,但是如果我这样编码:

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

在输入 01 时出现了错误,但当我编写代码时

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

01作为输入完美运行。 是什么原因?


2
如果您使用eval,可能会遇到一些灾难性的问题,例如eval("__import__('os').system('rm -rf $HOME')")(这将删除您主目录中的文件,请不要尝试...) - Dietrich Epp
2个回答

8
eval 评估 Python 表达式。在 Python 3 中,以 0 开头的数字不被允许(除了 0000,详见为什么Python 3中的000等于0?)。在 Python 2 中,这些数字被解释为八进制(基数为8)数字。这并没有更好的效果...(现在 Python 3 的八进制使用 exclusively 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会忽略这段代码。


5
不仅更安全,而且如果无法生成一个 int,它还会失败,这样您可以重新尝试或者进行其他操作,而不是生成一个不是 int 的东西... - Jon Clements
我可以理解为eval用于执行更复杂的表达式,而int仅将字符串转换为整数吗?八进制和零语法是什么? - Cheang Wai Bin
1
eval函数可以运行任何Python代码。int函数试图将任何类型转换为整数(包括浮点型,布尔型,字符串等)。十进制是一种基于8的表示方法:在Python 2中,010 == 8 (类似于二进制或十六进制)。但是,在Python 3中这种方法不再适用。 - Jean-François Fabre

6

eval()用于验证表达式。任何数字都被视为表达式,除了八进制数字(以0开头的数字)。int()处理字符串转换为整数。有许多理由不使用eval()。请记住:

  • Python 2.x

    x = raw_input('Enter number here: ') 
    
  • Python 3.x

    x = input('Enter number here: ') 
    
  • Python 2.x
    Security risk:

    x = input('Enter number here: ') 
    
  • Python 3.x
    Security risk:

    x = eval(input('Enter number here: ')) 
    
此外,请注意eval()具有运行代码的潜力,这可能会导致巨大的安全风险。我建议除非您清楚知道自己在做什么或可能会危及应用程序,否则不要使用它。

什么样的安全风险?我是编程新手。 - Cheang Wai Bin
你可以在这里查看许多不同的示例和解释:链接 - Francisco Flores
你可以像这样 import subprocess; eval("subprocess.run('whatever program I like')"),但这非常危险,用户可能不应该被允许这样做。因此,你应该只传递100%可信赖的输入给 eval - user1747134

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接