>>> x = { 'a' : 'b' , 'c' : 'd' }
>>>'a' and 'c' in x
True
>>>'a' and 'b' in x
False
>>>'b' and 'c' in x
True
如果in <dict>检查 key ,为什么最后一个查找 b返回 true即使没有这样的 key b ?
请您参考如下方法:
你想要 'b' in x 和 'c' in x
您误解了 和 运算符的工作方式(并且您的运算符优先级错误)。 in 的优先级高于 and,因此您的表达式被解析为:
if 'b' and ('c' in x):
这与:
if 'c' in x:
因为 bool('b') 总是 True 因为 'b' 是一个非空字符串。
这是一个table of operator precedence in python
请注意,即使 and 的优先级高于 in,您仍然不会得到您想要的,因为 ('b' and 'c' ) in x 将减少到 'c' in x,因为 'b' and 'c' 返回 'c'。
重写表达式的一种方法是:
if all( key in yourdict for key in ('b', 'c') ):
这对于只检查 2 个键来说有点矫枉过正,但是如果你有更多的键要检查的话很快就会有用。
作为最后的评论,您可能正在尝试应用运算符链接(这非常简洁)。但是,有些运算符不太适合链接(in 就是其中之一)。像 3 > 10 > 100 > 1000 这样的表达式通过一些奇怪的 python 黑魔法起作用。根据我的经验,关系运算符可以很好地链接('<'、'>'、'=='、'<='、'>='),但大多数其他运算符不会以直观的方式链接。一般来说,
a operator b operator c operator ...
相当于:
(a operator b) and (b operator c) and (c operator ...
