在控制台上我输入
>>> class S(str): pass
...
>>> a = 'hello'
>>> b = S('hello')
>>> d = {a:a, b:b}
>>> d
{'hello': 'hello'}
>>> type(d[a])
<class '__main__.S'>
>>> type(d[b])
<class '__main__.S'>
我一开始以为原因是d
只保留了一对是因为hash(a)
and hash(b)
返回相同的值,所以我尝试:
>>> class A(object):
... def __hash__(self):
... return 0
...
>>> class B(object):
... def __hash__(self):
... return 0
...
>>> d = {A():A(),B():B()}
>>> d
{<__main__.A object at 0x101808b90>: <__main__.A object at 0x101808b10>, <__main__.B object at 0x101808d10>: <__main__.B object at 0x101808cd0>}
现在我很困惑。
为什么在第一个代码清单中,d
只保留了一对,但在第二个列表中d
尽管具有相同的哈希值,但两个密钥都被保留?
原始示例中的两个对象被折叠不是因为它们具有相同的哈希值,而是因为它们比较相等。字典键是唯一的equality,不是哈希。 Python 要求任何两个比较相等的对象必须具有相同的哈希值(但不一定相反)。
在第一个示例中,这两个对象是相等的,因为它们都具有str
平等行为。由于两个对象比较相等,因此它们会合并为一个。在第二个示例中,它们比较不相等。默认情况下,用户定义的类使用标识来实现相等性——也就是说,每个对象仅与自身进行比较。所以你的两个对象不相等。它们具有相同的哈希值并不重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)