python词典难题

2024-04-25 17:30:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在我输入的控制台上

>>> 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)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尽管有相同的散列,但两个键都保留了?你知道吗


Tags: 代码selfhello列表returnobjectmaindef
3条回答

哈希不能确定字典中的唯一键。在某些方面,散列函数是一种“实现细节”,因为它们决定字典如何在内部存储其条目。a==b意味着散列(a)==hash(b),但反之一般不成立。两个键还需要彼此相等(当应用==运算符时),才能在字典中被视为等价键。你知道吗

如果希望类型为hashable,则you must also define ^{}str正确地定义了__eq__(),但是AB没有。你知道吗

原始示例中的两个对象被折叠不是因为它们具有相同的哈希值,而是因为它们的比较相等。Dict键对于相等性而言是唯一的,而不是散列。Python要求比较相等的任何两个对象必须具有相同的哈希(但不一定相反)。你知道吗

在第一个示例中,这两个对象是相等的,因为它们都具有str相等行为。由于两个对象比较相等,因此它们折叠为一个。在第二个例子中,它们并不相等。默认情况下,用户定义的类使用identity表示相等,也就是说,每个对象只与自身相等。所以你的两个物体是不相等的。他们有相同的杂凑也没关系。你知道吗

相关问题 更多 >