我已经写了一个类,其实施需要很长时间才能执行。我一直在考虑缓存它的散列,并将其存储在一个像._hash
这样的变量中,因此.__hash__()
方法将简单地返回._hash
。 (这将在.__init__()
的末尾计算或者第一次被调用.__hash__()
。)Python:是否有任何理由*不*缓存对象的散列?
我的推理是:“这个对象是不可变的 - >它的散列值永远不会改变 - >我可以缓存散列值。
但现在让我想到:你可以说任何可哈希对象的同样的事情。 (除了哈希值是它们的ID的对象)
因此,有没有理由而不是缓存对象的散列,除了散列计算非常快的小对象?
当然,如果一个对象是可变的,那么实现'__hash__'通常是一个坏主意。 '__hash__'的唯一内建使用要求哈希值稳定。 – 2010-09-24 13:18:39
不,当您更改对象的属性时,__hash__'的默认实现不会返回任何不同的内容。因为默认情况下,对于任何对象都是如此:'hash(obj)== id(obj)== hash(id(obj))' - 这意味着对象只需将它们的id作为它们的哈希值。该ID是静态的,所以你可以说对象默认“缓存”它们的散列。 – 2010-09-24 13:22:32