[Zope-Coders] Fw: [Zope] sessions and zope2.6.0

Chris McDonough chrism@zope.com
22 Oct 2002 13:42:07 -0400


This is almost certainly the problem in my code (obviously).  We'll see
how listifying this piece does in practice.  You're my hero. ;-)

- C


On Tue, 2002-10-22 at 12:37, Tim Peters wrote:
> FYI, here's an example:
> 
> >>> t = IIBTree()
> >>> for i in range(100):
> ...     t[i] = i
> ...
> 
> >>> for k in t.keys(None, 20):
> ...     del t[k]  # Bad Idea to mutate while iterating
> ...
> 
> >>> list(t.keys()) # oops
> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33,
>  35, 37, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
>  54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
>  70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
>  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
> 
> >>> t = IIBTree()
> >>> for i in range(100):
> ...     t[i] = i
> ...
> >>> for k in list(t.keys(None, 20)):
> ...     del t[k]   # OK if iterating over a distinct list of keys
> ...
> >>> list(t.keys())
> [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
>  37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
>  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
>  69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
>  85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
> >>>
> 
> In effect, in the first example the initial t.keys() object points into
> "internal slot number 0".  It gets the first key and updates its pointer to
> "internal slot number 1".  del t[k] then physically deletes the key at slot
> #0, and physically *moves* all the keys in the first bucket left one slot.
> So what *was* in slot #1 (the integer 1) moves into slot #0, and the
> iterator object will never look at slot #0 again, so the key 1 survives.
> OTOH, what was in slot #2 (the integer 2) moves into slot #1, and so that's
> the key the iterator sees the next time around.  Etc.  It's an unpredictable
> mess, and at internal bucket boundaries the seemingly regular pattern breaks
> down (because it's not the entire BTree that "shifts a slot to the left"
> when a delete happens, it's only the bucket containing the key being deleted
> that shifts left).
>