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作为输入工作完美。为什么会这样?
- @ C????S?????这是怎样一个合适的重复目标?这个链接不能解释前导的零问题。
- 相信金库,他知道Python的复制品!这个问题很好。
- 好的,伙计们,重新开放。
- 如果你使用eval,你可能会得到灾难性的结果,比如eval("__import__('os').system('rm -rf $HOME')")(它会删除你的主目录中的文件,不要尝试这个…)
型
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忽略该代码。
- 它不仅更安全-它也会失败,所以你可以重新尝试,或者如果一个int不能生产-而不是生产一个不是它的东西…
- 好点。编辑
- 我能理解为eval用于执行复杂的表达式,而int只将字符串转换为整数吗?什么是八进制和零语法?
- eval计算任何python代码。int尝试将任何类型转换为整数(float、bool、string…)。你明白了。八进制是以8为底的表示法:在python 2中:010 == 8(类似于二进制或十六进制)。在Python3中,它不再工作了。
型
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()有可能运行代码,这可能会造成巨大的安全风险。我建议您不要使用它,除非您清楚地知道自己在做什么,否则它可能会损害您的应用程序。
- 什么样的安全风险?我是编程新手
- 您可以在这里查看许多不同的示例和解释
- 例如,您可以使用非常危险的import subprocess; eval("subprocess.run('whatever program I like')"),用户不应该允许这样做。因此,您应该只将100%可信的输入传递给eval。