Hashability questions
Ian Kelly
ian.g.kelly at gmail.com
Tue May 15 20:50:06 EDT 2012
On Tue, May 15, 2012 at 3:25 AM, Christian Heimes <lists at cheimes.de> wrote:
> Code explains more than words. I've created two examples that some issues.
>
> Mutable values break dicts as you won't be able to retrieve the same
> object again:
Sure, you'll get no argument from me on that. I was more interested
in the other one.
> When you mess up __eq__ you'll get funny results and suddenly the
> insertion order does unexpected things to you:
>
>>>> class Example2(object):
> ... def __init__(self, value):
> ... self.value = value
> ... def __hash__(self):
> ... return hash(self.value)
> ... def __eq__(self, other):
> ... return hash(self) == hash(other)
> ...
>>>> d = {}
>>>> ob = Example2("egg")
>>>> d[ob] = True
>>>> d
> {<__main__.Example2 object at 0x7fab66cb7610>: True}
>>>> d["egg"] = True
>>>> d
> {<__main__.Example2 object at 0x7fab66cb7610>: True}
>>>> d2 = {}
>>>> d2["egg"] = True
>>>> d2[ob] = True
>>>> d2
> {'egg': True}
That's just how sets and dicts work with distinct objects that compare
equal. I don't see any fundamental difference between that and this:
>>> d = {}
>>> d[42] = True
>>> d
{42: True}
>>> d[42.0] = True
>>> d
{42: True}
>>> d2 = {}
>>> d2[42.0] = True
>>> d2
{42.0: True}
>>> d2[42] = True
>>> d2
{42.0: True}
I wouldn't consider the hashing of ints and floats to be broken.
More information about the Python-list
mailing list