u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口
大家都已经是耳熟能详了,前者是判断值是否相等,后者是判断引用是否相等,在用
如果不实现__eq__方法,那么自定义类型会调用默认的__eq__方法, 通过默认方法进行比较的相等条件相当严格,只有自己和自己比才会返回True,表现如下
谈及__eq__方法,就不得不谈__hash__,两者总是一起出现.在Python中,如果自定义类定义了__eq__而未定义__hash__方法的话,那么默认将__hash__方法设置为None。这会有什么潜在问题呢?
Python中的对象分为可变和不可变对象,我们从另一个角度来看,可以分为可哈希对象和不可哈希对象。通俗的说,可哈希对象可以作为字典的键,不可哈希对象无法作为字典的键。有时候,我们使用列表或者自定义对象作为字典的键,或者使用set进行元素去重的时候,会遇到unhashable type: xxx之类的问题,这类问题出现的原因就是字典的键或者集合中的元素类型为不可哈希类型。
那么常见的不可哈希类型有哪些呢?几乎都是一些常见的可变类型,比如列表、集合和字典等,都是不可哈希类型。有时候我们有对元素类型为不可变类型的对象进行去重或者使用它作为字典的key的需求,这个时候又该怎么做呢?
我们可以自定义一个类,来实现__eq__和__hash__方法达到这个效果,且看下面代码
从上面结果我们可以看到k这个实例并未加入s这个集合,但是在判断时返回了True,原因就是j和k两者的__hash__和__eq__运算结果相同
可以看到在关于通过hash运算判断两个对象是否映射成一个值是需要__hash__和__eq__方法共同决定的