Casey wrote: > 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?
It's a shorthand for [None:None:-1]. I think you're misinterpreting the sentence, "If i or j are omitted or None, they become ``end'' values (which end depends on the sign of k)." The end values *aren't* 0 and n except by happenstance. None (or omission) is a special marker that says "go to the end". -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco -- http://mail.python.org/mailman/listinfo/python-list