如果一个对象是不可散列的,比如一个set,那么询问它是否是字典中的键是错误的:
>>> key = set()
>>> key in {}
Traceback (most recent call last):
TypeError: unhashable type: 'set'我只是想知道为什么会这样。
编辑:我知道对象需要散列,但不知道为什么它需要是一个错误,如果它不能。
发布于 2017-04-29 03:17:00
这样更有用。
key in d被认为等同于
any(key == k for k in d)对于不可散列的对象,这实际上可能是真的:
d = {frozenset(): 1}
key = set()
print(any(key == k for k in d)) # prints True因此,尝试总是为不可散列的对象返回False将会造成不一致。从理论上讲,我们可以尝试回退到for循环,但这将导致O(len(d))性能下降,并使字典的好处化为乌有。
此外,即使key in d对于不可访问的key总是False,或者如果它有某种回退,大多数发生这样的测试的实例仍然可能是由于bug而不是故意的。异常比False结果更有用。
https://stackoverflow.com/questions/43687330
复制相似问题