之前我听说eval(input(a))
会自动将一个字符串转换为整数,但是如果我这样编码:
age = eval(input("enter age"))
在输入 01 时出现了错误,但当我编写代码时
age = int(input("enter age"))
01作为输入完美运行。 是什么原因?
之前我听说eval(input(a))
会自动将一个字符串转换为整数,但是如果我这样编码:
age = eval(input("enter age"))
在输入 01 时出现了错误,但当我编写代码时
age = int(input("enter age"))
01作为输入完美运行。 是什么原因?
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会忽略这段代码。
int
,它还会失败,这样您可以重新尝试或者进行其他操作,而不是生成一个不是 int
的东西... - Jon Clementseval
用于执行更复杂的表达式,而int
仅将字符串转换为整数吗?八进制和零语法是什么? - Cheang Wai Bin010 == 8
(类似于二进制或十六进制)。但是,在Python 3中这种方法不再适用。 - Jean-François Fabreeval()
用于验证表达式。任何数字都被视为表达式,除了八进制数字(以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()
具有运行代码的潜力,这可能会导致巨大的安全风险。我建议除非您清楚知道自己在做什么或可能会危及应用程序,否则不要使用它。import subprocess; eval("subprocess.run('whatever program I like')")
,但这非常危险,用户可能不应该被允许这样做。因此,你应该只传递100%可信赖的输入给 eval
。 - user1747134
eval
,可能会遇到一些灾难性的问题,例如eval("__import__('os').system('rm -rf $HOME')")
(这将删除您主目录中的文件,请不要尝试...) - Dietrich Epp