When slicing in python, omitting the end portion of the slice (ie the end in list[:end:]) results in end being define
end
list[:end:]
l[::-1] is the same thing as l.__getitem__(slice(None, None, -1)). Since the start and the stop are both None, the list will be traversed from one end to the other. The step argument determines the direction as well as the step.
l[::-1]
l.__getitem__(slice(None, None, -1))
None
step