与 Python 的 `in` 运算符相关的混淆

Nik*_*ita 13 python

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

d = {}
'k' in d == False # False! 
Run Code Online (Sandbox Code Playgroud)

我认为这是因为优先级:

('k' in d) == False # True, it's okay
'k' in (d == False) # Error, it's also okay
Run Code Online (Sandbox Code Playgroud)

但是,什么优先级评估以下表达式呢?

d = {}
'k' in d == False
Run Code Online (Sandbox Code Playgroud)

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

'k' in (d == False)
Run Code Online (Sandbox Code Playgroud)

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

'k' in d == False
Run Code Online (Sandbox Code Playgroud)

che*_*ner 23

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

'k' in d == False
Run Code Online (Sandbox Code Playgroud)

相当于

'k' in d and d == False
Run Code Online (Sandbox Code Playgroud)

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

你几乎永远需要直接比较布尔文字,虽然。这里的“正确”表达是'k' not in d.


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

comparison    ::=  or_expr (comp_operator or_expr)*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"
Run Code Online (Sandbox Code Playgroud)

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