python中eval()函数实际应用的一个疑问?
题目描述
获取一个随机验证码并通过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("您的验证信息输入有误!")
你期待的结果是什么?实际看到的错误信息又是什么?
我希望看到我验证成功实际看到的截图如下
回复
1个回答

test
2024-07-18
eval('a + b')
eval需要在上下文中查找,a
和b
的值的。很显然,并没有在上下文中设置a, b
的值。
eval(expression[, globals[, locals]])
- expression -- 表达式。
- globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
所以,你这样写才可以
>>> a = 3
>>> b = 4
>>> eval('a+b', {'a': a, 'b': b})
7
关于globals
和locals
你可以在这里看下。
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}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容