python – 为什么`a == b或c或d`总是评估为True?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 为什么`a == b或c或d`总是评估为True?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1570字,纯文字阅读大概需要3分钟。
内容图文
![python – 为什么`a == b或c或d`总是评估为True?](/upload/InfoBanner/zyjiaocheng/717/eaaec73644114837863bb6feec62ea89.jpg)
我正在编写一个拒绝访问未授权用户的安全系统.
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
内容总结
以上是互联网集市为您收集整理的python – 为什么`a == b或c或d`总是评估为True?全部内容,希望文章能够帮你解决python – 为什么`a == b或c或d`总是评估为True?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。