【发布时间】:2017-10-17 04:53:58
【问题描述】:
例如,元组(1,[0,1,2])。我从设计的角度理解为什么;如果元组仍然是可散列的,那么通过将任何不可散列的类型包装在元组中来使其可散列是微不足道的,这会破坏散列性的正确行为,因为您可以更改对象的值而不更改元组的散列值.但是,如果元组不可散列,那么我不明白是什么让对象可散列——我认为它只需要实现__hash__(self),元组就是这样做的。
根据我看过的其他答案以及测试示例,似乎这样的对象是不可散列的。 tuple.__hash__() 为其组件对象调用 __hash__ 似乎是明智的行为,但我不明白从实现的角度来看这是如何工作的,例如我不知道当字典仍然是类型元组并且元组仍然定义 __hash__ 时,它是如何将其识别为不可散列类型的。
【问题讨论】:
-
“为什么包含不可散列类型的元组不可散列?”答案就在问题中;)
-
定义了
__hash__函数并不意味着所有可能的元组都是可散列的。就像定义了逆函数并不意味着0有逆函数。 -
此外,您可以轻松定义一个自定义类,该类实现了
__hash__,但它是可变的。当然,如果您将该类的实例用作 dict 键或设置项,然后对实例进行变异,则可能会发生奇怪的事情。 ;)
标签: python