question on slices

Michael Chermside mcherm at destiny.com
Mon Mar 25 18:00:29 EST 2002


>>>> numlist[1:2]
> [1]
> 
> This last one doesnt make since to me since i am asking for a range
> from 1-2.  Why in the world does it give me 1 when i am asking for 1-2
> which would logically be:
> 
>>>> numlist[1:2]
> [1, 2]
> 
> but it's not. it doesnt make since.  Just seems strange when i just
> was in a C++ class and it would do the logical thing.
> 

Actually, this *IS* doing the "logical" thing, but only once you get 
into certain Python mindsets.

In Python, all ranges are "half-open". That means that the lower end 
point IS included, but the upper end point is not. You've encountered 
this pattern before in C++:

      for( int i=0; i<MAX; i++ )

In that code, i will actually be 0, but it will NOT actually be MAX... 
it gets no higher than MAX-1. This is the "standard" way to loop through 
a list of length MAX in C++, and in Python it is the "standard" way to 
do EVERYTHING... loops:

      for x in range(10)   # Goes 0, 1, 2, ... 8, 9

slices:

      mylist[:10]     # Gives [ mylist[0], mylist[1], ... mylist[9] ]

and a few other places which don't occur to me immediately.

So Python has the wonderful advantage of being consistant.

You could now start a whole debate about whether "half-open" is the best 
rule to use... "closed" is the other popular option. I think you'll find 
that "half-open" is a good choice, because it allows things like this:

      first = mylist[:47]
      last  = mylist[47:]

which splits mylist into two parts, and doesn't skip or repeat any 
elements. But what I really want to do is brag about the consistance, 
not re-open the "half-open" vs "closed" debate again.

-- Michael Chermside

PS: Whoah! how early were YOU to be able to grab "john at yahoo.com" ? !






More information about the Python-list mailing list