python – 为什么`a == b或c或d`总是评估为True?
作者:互联网
我正在编写一个拒绝访问未授权用户的安全系统.
import sys
print("Hello. Please enter your name:")
name = sys.stdin.readline().strip()
if name == "Kevin" or "Jon" or "Inbar":
print("Access granted.")
else:
print("Access denied.")
它按预期授予对授权用户的访问权限,但它也允许未经授权的用户访问!
Hello. Please enter your name:
Bob
Access granted.
为什么会这样?我明确表示只有在姓名等于Kevin,Jon或Inbar时才授予访问权限.我也尝试过相反的逻辑,如果“Kevin”或“Jon”或“Inbar”== name,但结果是一样的.
解决方法:
在许多情况下,Python的外观和行为与自然英语相似,但这是抽象失败的一种情况.人们可以使用上下文线索来确定“Jon”和“Inbar”是加入动词“equals”的对象,但Python解释器更具有文字意识.
if name == "Kevin" or "Jon" or "Inbar":
在逻辑上等同于:
if (name == "Kevin") or ("Jon") or ("Inbar"):
对于用户Bob来说,相当于:
if (False) or ("Jon") or ("Inbar"):
或运算符选择正数为truth value的第一个参数:
if ("Jon"):
由于“Jon”具有正的真值,因此if块执行.这就是导致“授予访问权限”被打印的原因,无论给出的名称如何.
如果“Kevin”或“Jon”或“Inbar”== name,所有这些推理也适用于表达式.第一个值“Kevin”是真的,所以if块执行.
有两种常用方法可以正确构建此条件.
>使用多个==运算符显式检查每个值:
如果name ==“Kevin”或name ==“Jon”或name ==“Inbar”:
>编写一系列有效值,并使用in运算符测试成员资格:
如果名字在{“Kevin”,“Jon”,“Inbar”}:
一般来说,第二个应该是首选,因为它更容易阅读,也更快:
>>> import timeit
>>> timeit.timeit('name == "Kevin" or name == "Jon" or name == "Inbar"', setup="name='Inbar'")
0.4247764749999945
>>> timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")
0.18493307199999265
标签:boolean-expression,python,boolean 来源: https://codeday.me/bug/20190910/1802168.html