8

我想测试字典中是否存在一个键作为“如果键不在字典中:做某事”我已经多次这样做了,但这次它的行为很奇怪。

特别:

termCircuit = termCircuitMap[term]

返回 KeyError

当我在 Eclipse PyDev 中调试这段代码时,我得到了以下信息(使用表达式):

term in termCircutiMap        # prints False
term in termCircuitMap.keys() # prints True

有谁知道这怎么可能?我认为如果某些东西“在”键集中,那么它就“在”字典中。

我附上评估的截图。

http://img836.imageshack.us/img836/1274/screenshotpython.png

非常感谢您的解释:)

4

1 回答 1

11

如果您的密钥__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__,也不应该用作字典中的键。)

于 2013-04-24T19:20:44.817 回答