首页 > 后端开发 > Python教程 > 为什么 Python 中的 `name == 'Kevin' or 'Jon' or 'Inbar'` 总是评估为 True?

为什么 Python 中的 `name == 'Kevin' or 'Jon' or 'Inbar'` 总是评估为 True?

Susan Sarandon
发布: 2024-12-21 04:16:14
原创
460 人浏览过

Why Does `name ==

为什么使用 Or 进行赋值总是求值为 True?

当使用逻辑运算符比较多个值时,Python 的行为可能会偏离我们的直观理解。例如,在代码中:

name = input("Hello. Please enter your name: ")
if name == "Kevin" or "Jon" or "Inbar":
    print("Access granted.")
else:
    print("Access denied.")
登录后复制

即使未经授权的用户也可以访问,因为 Python 将此表达式计算为:

if (name == "Kevin") or ("Jon") or ("Inbar"):
登录后复制

在这种情况下,对于任何名称,结果都是 True因为“Jon”和“Inbar”被视为独立的逻辑操作数。

如何将一个值与多个值进行比较其他

要正确比较多个值:

  • 使用多个 == 运算符:
if name == "Kevin" or name == "Jon" or name == "Inbar":
登录后复制
  • 雇用集合:
if name in {"Kevin", "Jon", "Inbar"}:
登录后复制
  • 利用any()和生成器表达式:
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):
登录后复制

性能比较

为了可读性和为了提高效率,通常首选使用集合:

import timeit
timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")  # Faster
timeit.timeit('any(name == auth for auth in ["Kevin", "Jon", "Inbar"])',
             setup="name='Inbar'")  # Slower
登录后复制

解析行为证明

内置的 ast 模块确认像 a == b 或 c 这样的表达式or d 被解析为:

BoolOp(
    op=Or(),
    values=[
        Compare(left=Name(...), ops=[Eq()], comparators=[Name(...)]),
        Name(...),
        Name(...),
        Name(...)])
登录后复制

表示“or”应用于各个比较,表达式。

以上是为什么 Python 中的 `name == 'Kevin' or 'Jon' or 'Inbar'` 总是评估为 True?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板