【发布时间】:2016-11-01 11:43:11
【问题描述】:
我试图了解 Python 字典必须在内部做什么才能找到键。在我看来,hash 将首先被评估,如果发生冲突,Python 将遍历键,直到找到 eq 返回 True 的键。这让我想知道为什么以下代码有效(测试代码仅用于理解内部):
class MyClass(object):
def __eq__(self, other):
return False
def __hash__(self):
return 42
if __name__=='__main__':
o1 = MyClass()
o2 = MyClass()
d = {o1: 'o1', o2: 'o2'}
assert(o1 in d) # 1
assert(d[o1]=='o1') # 2
assert(o2 in d) # 3
assert(d[o2]=='o2') # 4
字典是否应该找不到正确的键(在 #2 和 #4 两种情况下都返回“o1”或“o2”,或者抛出错误,具体取决于内部实现)。在这两种情况下,当它永远不能正确“等同”键(因为 eq 返回 False)时,它如何能够在正确的键上着陆。
我看到的所有关于散列的文档总是一起提到 hash 和 eq,从来没有提到 cmp、ne 等等,这让我认为这两个是唯一在这种情况下发挥作用的。
【问题讨论】:
标签: python dictionary hashable