Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的三层相等比较_Python - Fatal编程技术网

Python中的三层相等比较

Python中的三层相等比较,python,Python,在《掌握面向对象的Python》一书中,它说 平等性比较有三个层次: •相同的散列值:这意味着两个对象可以相等。散列值为我们提供了可能相等的快速检查。如果哈希值不同,则两个对象不可能相等,也不可能是同一个对象。 •比较为相等:这意味着散列值也必须相等。这是==运算符的定义。这些对象可能是同一个对象。 •相同IDD:这意味着它们是相同的对象。它们也会进行相等的比较,并具有相同的哈希值。这是is运算符的定义 我能理解第二个和第三个,但我真的不理解第一个。第一个和第二个是一样的。有人能解释一下吗?谢谢

在《掌握面向对象的Python》一书中,它说
平等性比较有三个层次:
•相同的散列值:这意味着两个对象可以相等。散列值为我们提供了可能相等的快速检查。如果哈希值不同,则两个对象不可能相等,也不可能是同一个对象。
•比较为相等:这意味着散列值也必须相等。这是==运算符的定义。这些对象可能是同一个对象。
•相同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字典)之类的容器中非常有用,可以快速知道在哪里查找特定对象。