首页 > 解决方案 > 与 Python 的 `in` 运算符相关的困惑

问题描述

我发现 Python 的in操作员有奇怪的行为

d = {}
'k' in d == False # False! 

我认为这是因为优先级:

('k' in d) == False # True, it's okay
'k' in (d == False) # Error, it's also okay

但是,那么计算以下表达式的优先级是什么?

d = {}
'k' in d == False

如果是因为错误的优先级,为什么它不会触发如下错误:

'k' in (d == False)

换句话说,这个表达式在 Python 的底层会发生什么?

'k' in d == False

标签: python

解决方案


in被认为是比较运算符,因此它受比较链接的影响。

'k' in d == False

相当于

'k' in d and d == False

因为两者in都是==比较运算符。

不过,您几乎不需要直接与布尔文字进行比较。这里的“正确”表达是'k' not in d


作为参考,这在 Python 文档6.10 下进行了描述。比较

comparison    ::=  or_expr (comp_operator or_expr)*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

比较可以任意链接,例如,x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当找到 x < y 时根本不计算 z是假的)。


推荐阅读