When s = 'abcdefg', s[0:4:-1] and s[1:-1:-1] return nothing in Python3. However, s[:4:-1] returns "gf". Could anyone explain the mechanism behind these two scenarios (especially in terms of memory)?
 
    
    - 21,584
- 4
- 41
- 73
 
    
    - 33
- 3
- 
                    1You might want to ready this https://stackoverflow.com/questions/509211/understanding-slice-notation – Olivier Melançon Aug 30 '19 at 13:19
- 
                    Possible duplicate of [Understanding slice notation](https://stackoverflow.com/questions/509211/understanding-slice-notation) – DjaouadNM Aug 30 '19 at 13:20
- 
                    I world argue it's not a perfect duplicate since it des not specifically exploits OP's cornercase – Olivier Melançon Aug 30 '19 at 13:21
- 
                    Hi @OlivierMelançon, I've read the thread, and don't think there is answer for my question. MrGeek, as mentioned above, the thread can't answer why s[0:4:-1] return nothing, so I don't think this my question is duplicate. – Sid Lin Aug 30 '19 at 13:48
- 
                    @SidLin It actually does but very briefly. Please see my answer for a complete explanation – Olivier Melançon Aug 30 '19 at 13:49
1 Answers
The start is always the first index of the iteration.
The stop is the end-boundary of your iteration.
The step gives an orientation and a step size to the iteration. So the iteration always goes from start to stop in the direction given by the sign of step.
Thus s[start:stop:step] means to take the characters s[start], s[start + step], s[start + 2 * step], ..., and so on until stop is reached.
In other words, s[start:stop:-1] is not equivalent to reversed(s[start: stop]).
Examples
Thus in your example s[0:4:-1], the is step negative so the iteration process immediately stops because the start index is already on the left of stop.
a b c d e f g h
0 1 2 3 4 5 6 7
^       ^
s       s
t       t
a       o
r       p
t
<-------- orientation
On the other end, if you were to try s[4:0:-1], you would get 'edcb' (remember that the stop index is excluded).
a b c d e f g h
0 1 2 3 4 5 6 7
^       ^
s       s
t       t
o       a
p       r
        t
<-------- orientation
Finally, leaving start empty means from the end of the string. This is why you see all characters from the end to index 4 in reverse.
a b c d e f g h
0 1 2 3 4 5 6 7
        ^     ^
        s     s
        t     t
        o     a
        p     r
              t
<-------- orientation
 
    
    - 21,584
- 4
- 41
- 73
- 
                    1Note that aside from the canonical reversing slice (`[::-1]`) it's usually harder to interpret a slice running in reverse, so even though it's slightly less efficient, it's often a good idea to perform your slice as a forward slice, then reverse it, e.g. `x[:4][::-1]` rather than the faster, but harder to read equivalent, `x[3::-1]`. – ShadowRanger Aug 30 '19 at 14:07
- 
                    @ShadowRanger Actually, I agree with the readability issue. I'd even add that I usually prefer the even more readable `reversed(x[:4])` when an iterator is sufficient. – Olivier Melançon Aug 30 '19 at 17:45