python 2.7存在于字典中

jla*_*nik 8 python python-2.7

我想在字典中测试一个键的存在,如果键不在字典中:做某事'我已经多次这样做了,但这次它表现得很奇怪.

尤其:

termCircuit = termCircuitMap[term]
Run Code Online (Sandbox Code Playgroud)

返回KeyError

当我在Eclipse PyDev中调试此代码时,我得到以下内容(使用表达式):

term in termCircutiMap        # prints False
term in termCircuitMap.keys() # prints True
Run Code Online (Sandbox Code Playgroud)

有谁知道这有可能吗?我认为,如果某些东西在"密钥集"中,那么它就在字典中.

我附上了评估的截图.

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

非常感谢解释:)

Edw*_*per 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我正在生成随机哈希值,这显然是一个坏主意.如果您的键值是可变的,那么具有相同效果的不太明显的问题可能是.(通常,可变值不应该定义__hash__,也不应该用作字典中的键.)

  • 尔加!花了我太长时间写同样的事情.我只能添加一个指向`__hash__`方法规则的链接:http://docs.python.org/2/reference/datamodel.html#object.__hash__ (2认同)