【问题标题】:Order of operation evaluation in condition in PythonPython中条件中的操作评估顺序
【发布时间】:2020-09-30 00:15:05
【问题描述】:

如果我有a = [1,2,3] 之类的东西,并且我写了1 in a == True 之类的语句,那似乎评估为假。

但是,如果我写 (1 in a) == True,则结果为 true。

我对 Python 如何评估第一条语句最终达到 false 感到有些困惑。

【问题讨论】:

  • 为什么要打扰== True?我认为像if 1 in a: 这样的东西无论如何读起来更好。
  • 1 in a == True 表示1 in a and a==True。搜索 python 运算符链接
  • 看完documentation之后有什么不明白的地方?我们希望您在帖子中包含该发现。

标签: python conditional-statements operator-precedence


【解决方案1】:

==in 都被视为 comparison 运算符,这意味着 operator chaining 生效:

比较可以任意链接,例如,x < y <= z 等价于 x < y and y <= z,除了 y 仅被评估一次(但在这两种情况下,z 在发现 x < y 时根本不会被评估是假的)。

这种链接允许您编写:

if 0 <= x < 20: # meaning: if x >= 0 and x < 20:

因此表达式1 in a == True 被链接为1 in a and a == True,并且由于and 的右侧计算结果为假,因此整个表达式为假。

当您用括号“隔离”表达式的一部分时,不会发生这种链接,这就是为什么(1 in a) == True 会按您的预期行事。


已经解释过,将布尔值与True(或False)进行比较并不是您真正应该做的事情,因为这会导致逻辑上无限的场景,例如:

if (((a == 7) == True) != False) == True # 'a == 7' already a boolean.

最好只使用以下之一:

if expression        # if comparing with True
if not expression    # if comparing with False

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多