Python中的三层相等性比较

David Zheng

在《精通面​​向对象的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

ac,尽管具有相同的哈希码,但并不相等(当然也不是同一对象)

>>> hash(a) == hash(c)
True
>>> a == c
False

很明显地说,ad有divverent哈希代码,所以它们不是平等的,不是同一个对象。

ae是相同的对象:

>>> a is e
True

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

>>> a == e
True

这是一连串的含义:

same object ==> equal
      equal ==> same hash code

注意隐含箭头的方向:我们不能说相反的方向,即,如果两个对象具有相同的哈希码,则我们不知道它们是否相等(必须使用==告诉);还是两个对象相等,我们不知道它们是否实际上是同一个对象(必须is用来说明)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python中定义三层字典?

来自分类Dev

三层架构中的外部通讯

来自分类Dev

Kramdown中的三层嵌套列表

来自分类Dev

Java 中的三层类调用

来自分类Dev

三层应用

来自分类Dev

LINQ-从包含三层的列表中检索对象的第三层列表

来自分类Dev

Bolt CMS中的三层子菜单

来自分类Dev

PHP和MYSQL中的三层嵌套数组

来自分类Dev

#show 中 NoMethodError 用于三层嵌套

来自分类Dev

遍历三层嵌套字典

来自分类Dev

三层嵌套字典理解?

来自分类Dev

三层部分嵌套模型

来自分类Dev

三层嵌套字典理解?

来自分类Dev

我如何解决第三层或第四层接口的依赖性

来自分类Dev

CSS下拉菜单中第三层的位置不正确

来自分类Dev

根据三层应用程序中的下拉列表填充文本框

来自分类Dev

在三层体系结构中实现线程:无法打开数据库

来自分类Dev

如何在MVC5 WCF中实现三层体系结构

来自分类Dev

三层系统中应将业务逻辑放在何处?

来自分类Dev

用于客户端-服务器的三层软件体系结构中的层封装

来自分类Dev

三层安全检查;会话仍然脆弱?

来自分类Dev

用户登录逻辑属于哪里?三层应用

来自分类Dev

聚合具有三层结构作为输出

来自分类Dev

Laravel的第三层关系的延迟渴望加载

来自分类Dev

三层架构和控制器

来自分类Dev

三层架构方法和设计方法

来自分类Dev

比较Swift中的字符串相等性:String!=(String)

来自分类Dev

比较Java中相等性的双精度值。

来自分类Dev

Handlebar.java:比较#if帮助器中的相等性