Dict when defining not returning multi value key error
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Fri Aug 1 00:04:18 EDT 2014
On Thu, 31 Jul 2014 20:12:12 -0700, Dan Stromberg wrote:
> I removed some quotes, and noticed that 1 and 1.0 hash the same. That's
> a bit unexpected, but I suppose it's not completely unreasonable.
You should expect that two equal objects should hash to the same value in
different versions of Python, or even from one run of Python to the next.
But within a single session, then far from being "not completely
unreasonable", having equal items hash to the same value is the only
reasonable thing to do. It is part of the dict API that if x == y, then
dict[x] == dict[y], and that cannot happen unless x and y hash to the
same thing.
In general, it's not entirely possible to enforce that, especially given
how flexible custom __eq__ methods can be, so Python doesn't even try.
But with *numbers* (or at least those which are part of the numeric
tower), Python does insist that each distinct value should hash to the
same result no matter what type that value happens to be:
py> n = 23
py> hash(n) == hash(long(n)) == hash(float(n)) == hash(complex(n))
True
py> from fractions import Fraction
py> from decimal import Decimal
py> hash(n) == hash(Fraction(n)) == hash(Decimal(n))
True
With the possible exception of Decimal, which is not fully integrated
with the numeric tower, all numbers in the standard library will obey the
condition that if x == y, hash(x) == hash(y), regardless of type.
--
Steven
More information about the Python-list
mailing list