例如,元组
根据我查看的其他答案和测试示例,似乎这样的对象是不可哈希的。合理的行为应该是
(1,[0,1,2])
。从设计的角度来看,我理解为什么会这样;如果元组仍然可哈希,则使用元组将任何不可哈希的类型变成可哈希的类型就变得轻而易举了,从而破坏了哈希性的正确行为,因为你可以改变对象的值而不改变元组的哈希值。但是,如果元组不可哈希,则我不明白什么使一个对象可哈希--我认为它只需要实现__hash__(self)
,像元组一样。根据我查看的其他答案和测试示例,似乎这样的对象是不可哈希的。合理的行为应该是
tuple.__hash__()
调用其组件对象的__hash__
,但我不理解从实现的角度如何工作,例如,当它仍然是元组类型并且元组仍然定义了__hash__
时,字典如何识别它为不可哈希的类型。
__hash__
函数并不意味着所有可能的元组都是可哈希的。就像定义了反函数并不意味着0
有一个反元素一样。 - Julien__hash__
但是可变的自定义类。当然,如果你将该类的实例用作字典键或集合项,然后突变这些实例,可能会发生一些奇怪的事情。 ;) - PM 2Ring