【发布时间】:2012-07-04 16:09:50
【问题描述】:
我经常使用时髦的东西作为字典的键,因此,我想知道正确的方法是什么 - 这通过为我的对象实现良好的哈希方法来实现。我知道这里提出的其他问题,例如good way to implement hash,但我想了解默认的__hash__ 如何用于自定义对象,以及是否可以依赖它。
我注意到可变对象是明确不可散列的,因为hash({}) 引发了一个错误......但奇怪的是,自定义类是可散列的:
>>> class Object(object): pass
>>> o = Object()
>>> hash(o)
那么,有人知道这个默认哈希函数是如何工作的吗?通过了解这一点,我想知道:
如果我将相同类型的对象作为字典的键,我可以依赖这个默认哈希吗?例如:
key1 = MyObject()
key2 = MyObject()
key3 = MyObject()
{key1: 1, key2: 'blabla', key3: 456}
如果我使用不同类型的对象作为字典中的键,我可以依赖它吗?例如
{int: 123, MyObject(10): 'bla', 'plo': 890}
在最后一种情况下,如何确保我的自定义哈希不会与内置哈希冲突?例如:
{int: 123, MyObject(10): 'bla', MyObjectWithCustomHash(123): 890}
【问题讨论】:
-
@gnibbler :已经知道了 - 请参阅问题中的链接
-
无关,但需要注意的一点是,“如果您要覆盖
__hash__,请同时覆盖__eq__。” -
User-defined classes have __eq__() and __hash__() methods by default; with them, all objects compare unequal (except with themselves) and x.__hash__() returns an appropriate value such that x == y implies both that x is y and hash(x) == hash(y).docs.python.org/3/reference/datamodel.html#object.__hash__
标签: python