编程语言
首页 > 编程语言> > python – 为什么`a == b或c或d`总是评估为True?

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