Python中的三层相等比较
在《掌握面向对象的Python》一书中,它说Python中的三层相等比较,python,Python,在《掌握面向对象的Python》一书中,它说 平等性比较有三个层次: •相同的散列值:这意味着两个对象可以相等。散列值为我们提供了可能相等的快速检查。如果哈希值不同,则两个对象不可能相等,也不可能是同一个对象。 •比较为相等:这意味着散列值也必须相等。这是==运算符的定义。这些对象可能是同一个对象。 •相同IDD:这意味着它们是相同的对象。它们也会进行相等的比较,并具有相同的哈希值。这是is运算符的定义 我能理解第二个和第三个,但我真的不理解第一个。第一个和第二个是一样的。有人能解释一下吗?谢谢
平等性比较有三个层次:
•相同的散列值:这意味着两个对象可以相等。散列值为我们提供了可能相等的快速检查。如果哈希值不同,则两个对象不可能相等,也不可能是同一个对象。
•比较为相等:这意味着散列值也必须相等。这是==运算符的定义。这些对象可能是同一个对象。
•相同IDD:这意味着它们是相同的对象。它们也会进行相等的比较,并具有相同的哈希值。这是is运算符的定义
我能理解第二个和第三个,但我真的不理解第一个。第一个和第二个是一样的。有人能解释一下吗?谢谢 首先,语言的散列函数非常好,通常两个不相等的对象不会有相同的散列值,但这是可能发生的。我们可以用一个糟糕的散列函数来演示这一点
def hash(string):
return len(string)
这是一个有效的散列函数,但正如您所看到的,在许多情况下,非相等值将返回相同的散列值。但正如我所说,python的内置哈希函数要好得多,而且这种情况很少发生,但这是可能的。考虑一下这个类:
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
具有相同的hashcode,并且是相等的,但不是相同的对象:
>>> hash(a) == hash(b)
True
>>> a == b
True
>>> a is b
False
>>> a is e
True
a
和c
尽管有相同的散列码,但它们并不相等(当然也不是相同的对象)
显然可以说,a
和d
有不同的散列码,因此它们不相等,也不是同一个对象
a
和e
是同一个对象:
>>> hash(a) == hash(b)
True
>>> a == b
True
>>> a is b
False
>>> a is e
True
因此,它们是相等的(当然具有相同的哈希代码):
这是一个连锁反应:
same object ==> equal
equal ==> same hash code
注意隐含箭头的方向:我们不能说任何相反的方向,即如果两个对象具有相同的哈希代码,我们不知道它们是否相等(必须使用
=
来说明);或者,如果两个对象相等,我们不知道它们是否实际上是相同的对象(必须使用is
来判断)。否,两个对象可以具有相同的哈希值,但不相等,如果两个对象具有相同的哈希值==
将决定它们是否相等。啊,我知道了。要使两个对象相等,首先,它们的哈希值必须相同,而且它们还需要满足一些其他要求才能相等。是的。当散列码相等时,它们可能是相同的,但我们需要用==
测试是否相等。散列代码在诸如散列映射(python字典)之类的容器中非常有用,可以快速知道在哪里查找特定对象。