Skip to main content
 首页 » 编程设计

python之var in dict 的奇怪行为

2025年05月04日11jillzhang

>>> 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 ...