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

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

Susan Sarandon
Susan Sarandon原创
2024-12-21 04:16:14501浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn