我正在编写一个安全系统,拒绝未经授权的用户访问
name = input("Hello. Please enter your name: ")
if name == "Kevin" or "Jon" or "Inbar":
print("Access granted.")
else:
print("Access denied.")
它按预期授予授权用户访问权限,但也允许未经授权的用户进入
Hello. Please enter your name: Bob
Access granted.
为什么会发生这种情况?我已经明确声明,只有当name
等于Kevin、Jon或Inbar时才授予访问权限。我也尝试过相反的逻辑,if "Kevin" or "Jon" or "Inbar" == name
,但结果是一样的
Note: this question is intended as the canonical duplicate target of this very common problem. There is another popular question How to test multiple variables against a single value? that has the same fundamental problem, but the comparison targets are reversed. This question should not be closed as a duplicate of that one as this problem is encountered by newcomers to Python who might have difficulties applying the knowledge from the reversed question to their problem.
在
if name == "Kevin" or "Jon" or "Inbar":
中有3个条件检查这个if语句等价于
由于
elif "Jon"
始终为真,因此授予任何用户访问权限解决方案
您可以使用下面的任何一种方法
快速
慢
缓慢+不必要的代码
简单的工程问题,让我们更进一步
但是,Python继承了C语言,将非零整数的逻辑值计算为True
现在,Python构建在该逻辑的基础上,并允许您使用逻辑文本,例如或整数,等等
最后
正确的书写方式是:
为了安全起见,我还建议你不要硬编码密码
在许多情况下,Python的外观和行为类似于自然英语,但这是抽象失败的一种情况。人们可以使用上下文线索来确定“Jon”和“Inbar”是连接到动词“equals”的对象,但Python解释器更注重文字
逻辑上等同于:
对于用户Bob,这相当于:
or
运算符选择第一个带有正truth value的参数:由于“Jon”具有正真值,因此执行
if
块。这就是为什么不管给定的名称如何,都会打印“已授予访问权限”所有这些推理也适用于表达式
if "Kevin" or "Jon" or "Inbar" == name
。第一个值"Kevin"
为true,因此执行if
块有两种常见的方法可以正确构造此条件
使用多个
==
运算符显式检查每个值:组成有效值的集合(例如集合、列表或元组),并使用
in
运算符测试成员资格:一般而言,应优先选择第二种,因为它更容易阅读,也更快:
对于那些想要证明
if a == b or c or d or e: ...
确实是这样解析的人。内置的ast
模块提供了一个答案:可以看到,布尔运算符
or
应用于四个子表达式:比较a == b
;和简单表达式c
、d
和e
相关问题 更多 >
编程相关推荐