Básicamente, has respondido tu propia pregunta. Cortar fuera de los límites de una secuencia (al menos para built-ins) no causa un error. Tiene sentido cuando lo piensas. La indexación devuelve un único elemento, pero el corte vuelve una subsecuencia de elementos. Entonces, cuando intenta indexar un valor inexistente, no hay nada que devolver; pero cuando cortas una secuencia fuera de los límites, aún puedes devolver una secuencia vacía.
También tenga en cuenta que no es una diferencia en general entre x[3]
y x[3:4]
. Por ejemplo:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
La razón por la que tienen el mismo aspecto en el caso de las cadenas es que no hay tal cosa como un carácter individual fuera de una cadena; un solo caracter es solo una cadena de 1 caracter.
'[999: 9999]' no es un índice, es un sector, y tiene una semántica diferente. Desde la introducción de Python: "Los índices de sectores degenerados se manejan con elegancia: un índice que es demasiado grande se reemplaza por el tamaño de cadena, un límite superior más pequeño que el límite inferior devuelve una cadena vacía". – geoffspear
@Wooble esa es la respuesta real – jondavidjohn
@Wooble ¿Y sabes por qué es así? Gracias por tu aclaración. – ijverig