adding elements to set

Chris Angelico rosuav at gmail.com
Thu Dec 8 12:37:18 EST 2011


On Fri, Dec 9, 2011 at 4:32 AM, Peter Otten <__peter__ at web.de> wrote:
> The only thing that has changed (in 2.7) is the algorithm to calculate the
> hash value. The bits are rotated to turn the four least significant bits
> into the most signicant ones. According to a comment in Objects/objects.c
> the change leads to fewer hash collisions.

Interesting, but what I saw was this:

>>> class C(object):

   def __init__(self, x):
       self.x = x

   def __eq__(self, other):
       return self.x == other.x

>>> s=set()
>>> c1=C(1)
>>> s.add(c1)
Traceback (most recent call last):
  File "<pyshell#163>", line 1, in <module>
    s.add(c1)
TypeError: unhashable type: 'C'

(This is in IDLE from Python 3.2 on Windows.)

However, s.add(object()) works fine. So subclasses don't get that.
Odd. Makes sense though - you can't get this unexpected behaviour as
easily.

ChrisA



More information about the Python-list mailing list