在《精通面向对象的Python》一书中,它说
了三层相等性比较:
•相同的哈希值:这意味着两个对象可以相等。哈希值可让我们快速检查可能的相等性。如果哈希值不同,则两个对象不可能相等,也不能是同一对象。
•比较为相等:这意味着哈希值也必须相等。这是==运算符的定义。这些对象可以是相同的对象。
•同一IDD:这意味着它们是同一对象。它们也比较相等,并将具有相同的哈希值。这是is运算符的定义。
我能理解第二和第三,但我真的不理解。第一和第二是一样的。有人能对此有所启发吗?谢谢!
考虑此类:
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
,并且如果它们具有相同的x
属性值,则认为该对象等于另一个对象)
现在创建5个类型的变量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
有divverent哈希代码,所以它们不是平等的,不是同一个对象。
a
和e
是相同的对象:
>>> a is e
True
因此,它们是相等的(当然具有相同的哈希码):
>>> a == e
True
这是一连串的含义:
same object ==> equal
equal ==> same hash code
注意隐含箭头的方向:我们不能说相反的方向,即,如果两个对象具有相同的哈希码,则我们不知道它们是否相等(必须使用==
告诉);还是两个对象相等,我们不知道它们是否实际上是同一个对象(必须is
用来说明)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句