What does the syntax [::-1] really mean?

Casey Caseyweb at gmail.com
Thu Oct 4 17:11:09 CEST 2007


I've used [::-1] as a shorthand for reverse on several occasions, but
it occurred to me yesterday I never really thought about why it
works.  First, I checked out the documentation.

>From section 3.6 of the Python Library Reference:

"The slice of s from i to j with step k is defined as the sequence of
items with index x = i + n*k such that 0 <= n < (j-i)/k. In other
words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j
is reached (but never including j). If i or j  is greater than len(s),
use len(s). If i or j are omitted or None, they become ``end'' values
(which end depends on the sign of k). Note, k cannot be zero. If k is
None, it is treated like 1."

>From Section 5.3.3 of the Python Language Reference (x[::-1] is a
"proper slice" in the BNF, hence the excerpt):

"The conversion of a proper slice is a slice object (see section 3.2)
whose start, stop and step attributes are the values of the
expressions given as lower bound, upper bound and stride,
respectively, substituting None for missing expressions."

Following the reference to section 3.2 provides a (non-rigorous)
description of what a slice object is, in terms of the extended
slicing semantics.  But it doesn't shed any additional light on the
meaning of [::-1].

>From this, I would expect that x[::-1] would be identical to x[n:0:-1]
(n and 0 being the "end" values, with the order switched due to the
negative step value).  But the clause that "(but never including j)"
means that x[n:0:-1] excludes the 1st element of x, x[0].  A quick
test in ipython confirms that "abc"[3:0:-1] => "cb", not "cba".
Changing the "end" value  to x[n:-1:-1] results in an empty string.

So my question is: "what exactly is [::-1] shorthand for"?  Or is it a
special case, in which case why isn't it  defined as such in the
library?




More information about the Python-list mailing list