【发布时间】:2015-12-21 18:57:15
【问题描述】:
我有两个用户定义的对象,比如 a 和 b。
这两个对象都具有相同的hash 值。
但是,id(a) 和 id(b) 是不相等的。
此外,
>>> a is b
False
>>> a == b
True
从这个观察中,我可以推断出以下内容吗?
- 不相等的对象可能具有相同的
hash值。 - 相等的对象需要具有相同的
id值。 - 每当调用
obj1 is obj2时,都会比较两个对象的id值,而不是它们的hash值。
【问题讨论】:
-
通过比较
id(a)和id(b),您的第二个推断很容易失效。 -
@chepner 谢谢。我现在明白了
-
我写了如何为内置类型 here 计算哈希值。您可以注意到对象类型的
hash计算取决于其id。 -
这与@Blckknght 在他的回答中所说的直接矛盾。他说哈希计算取决于对象中包含的值。
-
@DarshanChaudhary:你误解了 Delimetry 的评论。当他说“对象”(不是一般的对象)时,他指的是
object类型。object类型的实例除了其标识之外没有任何价值。默认情况下,也不做自定义类的实例。要为自定义类提供对“值”的不同解释,您需要为其提供__eq__方法(以及基于相同类型值的__hash__方法,如果您希望它是可散列的)。