python字典难题

mat*_*ots 7 python dictionary

在我输入的控制台上

>>> 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'>
Run Code Online (Sandbox Code Playgroud)

我一开始认为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>}
Run Code Online (Sandbox Code Playgroud)

现在我很困惑.为什么在第一个代码清单中d只保留了一对,但在第二个清单中d,尽管有相同的哈希,但两个密钥都被保留了?

Bre*_*arn 8

原始示例中的两个对象是折叠的,不是因为它们具有相同的哈希值,而是因为它们相等.Dict键在相等方面是唯一的,而不是哈希.Python要求任何两个比较相等的对象必须具有相同的哈希值(但不一定相反).

在第一个示例中,两个对象是相等的,因为它们都具有str相等的行为.由于两个对象比较相等,因此它们折叠为一个.在第二个例子中,他们不比较平等.默认情况下,用户定义的类使用identity来实现相等性 - 也就是说,每个对象只比较自身.所以你的两个对象并不相同.它们具有相同的哈希并不重要.