在掌握面向对象的Python 一书中,它表示了
有三层平等比较:
•相同的哈希值:这意味着两个对象可以相等。哈希值为我们提供了快速检查可能的相等性。如果哈希值不同,则两个对象不可能相等,也不能是同一个对象
•Compare As Equal:这意味着哈希值也必须相等。这是==运算符的定义。对象可以是同一个对象
•相同的IDD:这意味着它们是同一个对象。它们也比较相等,并且具有相同的哈希值。这是运算符的定义。
我能理解第二个和第三个,但我真的不明白第一个。第一个和第二个是相同的。任何人都可以对此有所了解吗?谢谢!
答案 0 :(得分:2)
考虑这个课程:
class Foo:
def __init__(self, x):
self.x = x
def __hash__(self):
return self.x**2
def __eq__(self, o):
return o.x == self.x
(它是一个带有(数字)属性x
的类,其哈希值为x^2
,如果它们具有{{1}的相同值,则被视为等于另一个对象}属性)
现在创建5个x
类型的变量:
Foo
>>> a=Foo(1)
>>> b=Foo(1)
>>> c=Foo(-1)
>>> d=Foo(2)
>>> e=a
和a
具有相同的哈希码,并且相同,但不是同一个对象:
b
>>> hash(a) == hash(b)
True
>>> a == b
True
>>> a is b
False
和a
,尽管具有相同的哈希码,但不相等(当然不是同一个对象)
c
很明显,>>> hash(a) == hash(c)
True
>>> a == c
False
和a
具有分散的哈希码,因此它们不相等而且不是同一个对象。
d
和a
是同一个对象:
e
因此它们是相同的(当然具有相同的哈希码):
>>> a is e
True
这是一系列含义:
>>> a == e
True
注意蕴涵箭头的方向:我们不能说反方向,即如果两个对象具有相同的哈希码,我们不知道它们是否相等(必须使用same object ==> equal
equal ==> same hash code
来告诉);或者如果两个对象相等,我们就不知道它们是否实际上是同一个对象(必须使用==
告诉)。
答案 1 :(得分:1)
首先,语言的散列函数非常好,通常两个不相等的对象不会有相同的散列值,但它可能会发生。我们可以使用错误的哈希函数来证明这一点。
def hash(string):
return len(string)
这是一个有效的哈希函数,但正如您所看到的,将会有许多实例,其中不相等的值将返回相同的哈希值。但就像我说的那样,python的内置哈希函数要好得多,这种情况很少发生,但这是可能的。