Final state of underlying sequence in islice
Terry Reedy
tjreedy at udel.edu
Thu Nov 4 17:57:09 EDT 2010
On 11/4/2010 12:42 PM, Shashank Singh wrote:
> Are there any promises made with regard to final state of the underlying
> sequence that islice slices?
The one you quote below.
> for example consider this
>
> >>> from itertools import *
> >>> c = count()
> >>> list(islice(c, 1, 3, 50))
> [1]
> >>> c.next()
> 51
When posting code and result, it is always a good idea to include
version. It is even more important when reporting a (possible) bug,
which might have been fixed already. As it turns out, I get the same
behavior above and below with 3.1.2.
> Now, the doc [1] says "If /stop/ is None, then iteration continues until
> the iterator is exhausted, if at all; otherwise, it stops at the
> specified position".
With a step greater than 1, 'specified position' is ambiguous. Any stop
value in [2,51] gives the same result. One could argue that the
effective stop value is either last returned + step as above does, or
last returned + 1 as Python version does.
> It clearly is not stopping at stop (3).
>
> Further, the doc gives an example of how this is *equivalent* to a
> generator defined in the same section. It turns out, these two are not
> exactly the
> same if the side-effect of the code is considered on the underlying
> sequence.
>
> Redefining islice using the generator function defined in the doc gives
> different (and from one pov, expected) result
> >>> def islice(iterable, *args):
> ... # islice('ABCDEFG', 2) --> A B
> ...
> >>> c = count()
> >>> list(islice(c, 1, 3, 50))
> [1]
> >>> c.next()
> 2
>
> While "fixing" this should be rather easy in terms of the change in code
> required it might break any code depending
> on this seemingly incorrect behavior.
>
> [1]. http://docs.python.org/library/itertools.html#itertools.islice
If you file a bug report, please give the link.
If you do not want to, say so and I will.
--
Terry Jan Reedy
More information about the Python-list
mailing list