我想测试字典中是否存在键,因为“如果键不在字典中:做某事” 我已经多次这样做了,但这次它的行为很奇怪。
特别是:
termCircuit = termCircuitMap[term]
返回键错误
当我在 Eclipse PyDev 中调试此代码时,我得到以下信息(使用表达式):
term in termCircutiMap # prints False
term in termCircuitMap.keys() # prints True
有人知道这是怎么可能的吗?我认为如果某些东西“在”键集中,那么它就在“字典中”。
我附上了评估的屏幕截图。
非常感谢您的解释:)
最佳答案
如果您的 key 的 __hash__
函数未正确定义,您可能会看到此行为。例如,以下给出与您描述的大致相同的行为:
import random
class Evil(int):
def __hash__(self):
return random.randint(0, 10000)
evil_vals = [Evil(n) for n in range(10)]
dict_with_evil_keys = dict((evil_val, None)
for evil_val in evil_vals)
print evil_vals[0] in dict_with_evil_keys # prints False
print evil_vals[0] in dict_with_evil_keys.keys() # prints True
在这种情况下,我生成随机哈希值,这显然是个坏主意。如果您的键值是可变的,则可能会产生同样效果的不太明显的问题。 (通常,可变值不应该定义 __hash__
,也不应该用作字典中的键。)
关于python 2.7 存在于字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16200067/