我发现 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下进行了描述。比较:
Run Code Online (Sandbox Code Playgroud)comparison ::= or_expr (comp_operator or_expr)* comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!=" | "is" ["not"] | ["not"] "in"
和
比较可以任意链接,例如,x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当找到 x < y 时根本不计算 z是假的)。