【发布时间】:2012-05-02 12:47:17
【问题描述】:
docs 表示只要定义了__hash__ 方法和__eq__ 方法的类是可散列的。然而:
class X(list):
# read-only interface of `tuple` and `list` should be the same, so reuse tuple.__hash__
__hash__ = tuple.__hash__
x1 = X()
s = {x1} # TypeError: unhashable type: 'X'
是什么让X 不可散列?
请注意,我必须有相同的列表(就常规相等而言)才能被散列到相同的值;否则,我将 violate this requirement 讨论哈希函数:
唯一需要的属性是比较相等的对象具有 相同的哈希值
文档确实警告说,在其生命周期内不应修改可散列对象,当然我不会在创建后修改 X 的实例。当然,解释器无论如何也不会检查。
【问题讨论】:
-
是的,只读接口是一样的,但是为什么你期望 tuple.__hash__ 只使用它自己类的外部接口呢?尤其是用 C 语言编写时。使用外部接口会慢得多。除非 B 类是 A 类的子类,否则您不能合理地期望 A 类中的方法适用于 B 类。您是否也尝试调用 x1.__hash__() 来查看它是否有效?
-
@LennartRegebro 是的,我同意...请参阅我对stackoverflow.com/a/10254636/336527的最后评论...我只是大脑冻结。
标签: python class python-3.x user-defined-types hashable