You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
让 set 能对字典对象去重,将会出现一个更大的问题。首先你必须清楚 set 为什么不能对字典对象去重,因为字典是一个可变的容器,将字典对象加入到 set 中并不影响它可变的特性。设想一种情况,两个不相等的字典对象加入到了 set 中,之后这两个字典对象经过变化值相等了,那这问题就大了,set 中的值不唯一了,这颠覆 set 的理念。
说了这么多是为了先给你建立一个正确的认知。然后呢我们就喜欢干这种颠覆认知的事情,我们完全可以做到让 gdict 对象使用 set 去重。
你必须了解下面两件事:
哈希理念:两个约相等的对象的哈希值一定相等,反之未必。
set 去重流程:先调用对象的 __hash__ 方法,若返回值相等,再调用 __eq__ 方法...
结合哈希理念与 set 去重流程,我们从 __hash__ 方法入手:
def__hash__(self):
return-2
重写 __hash__ 方法并固定返回值,这意味着 gdict 对象是可哈希的了,并且哈希值始终相等。此时 gdict 对象已经可以使用 set 去重了,它将忽略哈希检查,始终检查值是否相等。
这是大的问题,在一些场景中我们必须对字典对象去重,这就得引入或现写非哈希的去重算法,极为不便。如果能直接使用
set
去重,将大幅提高代码开发效率及可读性。我们能否做到让gdict
对象使用set
去重?The text was updated successfully, but these errors were encountered: