Python中的三层相等比较

时间:2015-07-06 01:52:02

标签: python

掌握面向对象的Python 一书中,它表示了 有三层平等比较:
•相同的哈希值:这意味着两个对象可以相等。哈希值为我们提供了快速检查可能的相等性。如果哈希值不同,则两个对象不可能相等,也不能是同一个对象 •Compare As Equal:这意味着哈希值也必须相等。这是==运算符的定义。对象可以是同一个对象 •相同的IDD:这意味着它们是同一个对象。它们也比较相等,并且具有相同的哈希值。这是运算符的定义。

我能理解第二个和第三个,但我真的不明白第一个。第一个和第二个是相同的。任何人都可以对此有所了解吗?谢谢!

2 个答案:

答案 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具有分散的哈希码,因此它们不相等而且不是同一个对象。

da是同一个对象:

e

因此它们是相同的(当然具有相同的哈希码):

>>> a is e
True

这是一系列含义:

>>> a == e
True

注意蕴涵箭头的方向:我们不能说反方向,即如果两个对象具有相同的哈希码,我们不知道它们是否相等(必须使用same object ==> equal equal ==> same hash code 来告诉);或者如果两个对象相等,我们就不知道它们是否实际上是同一个对象(必须使用==告诉)。

答案 1 :(得分:1)

首先,语言的散列函数非常好,通常两个不相等的对象不会有相同的散列值,但它可能会发生。我们可以使用错误的哈希函数来证明这一点。

def hash(string):
    return len(string)

这是一个有效的哈希函数,但正如您所看到的,将会有许多实例,其中不相等的值将返回相同的哈希值。但就像我说的那样,python的内置哈希函数要好得多,这种情况很少发生,但这是可能的。