On Thu, Aug 16, 2012 at 4:55 PM, Ian Kelly <ian.g.ke...@gmail.com> wrote: > On Thu, Aug 16, 2012 at 12:00 PM, Aaron Brady <castiro...@gmail.com> wrote: >> The inconsistency is, if we remove an element from a set and add another >> during iteration, the new element might appear later in the iteration, and >> might not, depending on the hash code; therefore comparing the size of the >> set between iterations isn't adequate. Example: > > It can be more than just the new element. For example, here the > entire set is repeated (Python 3.2): > >>>> s = set(range(8, 13)) >>>> it = iter(s) >>>> from itertools import islice >>>> list(islice(it, 5)) # avoid exhausting the iterator > [8, 9, 10, 11, 12] >>>> s.add(13) >>>> s.remove(13) >>>> list(it) > [8, 9, 10, 11, 12] > > This occurs because the addition of the sixth item triggers a resize > of the underlying hash table, and the existing items, which were > originally in slots 0-4, are now in slots 8-12.
Another curious example: >>> s = set(range(8, 48, 8)) >>> s {8, 16, 40, 24, 32} >>> it = iter(s) >>> from itertools import islice >>> list(islice(it, 4)) [8, 16, 40, 24] >>> s.add(48) >>> s.remove(48) >>> list(it) [8, 16, 40, 24] Hey, what happened to 32? -- http://mail.python.org/mailman/listinfo/python-list