python中eval()函数实际应用的一个疑问?

作者站长头像
站长
· 阅读数 18

题目描述

获取一个随机验证码并通过eval()函数校对是否与用户输入值一致

题目来源及自己的思路

我的思路是直接eval函数进行计算字符串表达式,但不行,后来发现新建一个变量可以完成完整代码,如我注释掉的两行代码,但我不明白为什么我这种直接调用的不行?

相关代码

粘贴代码文本(请勿用截图)import random

a = str(random.randint(0, 10))                    
b = str(random.randint(0, 10))                    
x = input(f"请输入计算验证信息的结果({a}+{b}):")              
# y = f"{a} + {b}"                                
# r = eval(y)                                     
r = str(eval('a + b'))                            
if x == str(r):                                   
    print("您已经通过验证!")                             
else:                                             
    print("您的验证信息输入有误!")                          
                                                  

你期待的结果是什么?实际看到的错误信息又是什么?

我希望看到我验证成功实际看到的截图如下python中eval()函数实际应用的一个疑问?

回复
1个回答
avatar
test
2024-07-18

eval('a + b') eval需要在上下文中查找,ab的值的。很显然,并没有在上下文中设置a, b的值。

eval(expression[, globals[, locals]])
- expression -- 表达式。
- globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

所以,你这样写才可以

>>> a = 3
>>> b = 4
>>> eval('a+b', {'a': a, 'b': b})
7

关于globalslocals你可以在这里看下。

https://docs.python.org/3/lib...https://docs.python.org/3/lib...https://docs.python.org/3/lib...

eval('a+b', {'a': a, 'b': b}) 其实就是在 globals() 全局命名空间中添加了如下:

>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 3, 'b': 4}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容