¿Por qué el índice de corte de subcadenas fuera de rango funciona en Python?

¿Por qué el 'example'[999:9999] produce un error? Como el 'example'[9] hace, ¿cuál es la motivación detrás de esto?

A partir de este comportamiento, puedo suponer que 'example'[3] es, esencialmente / internamente, no es lo mismo que 'example'[3:4] , aunque ambos resulten en la misma cadena 'm' .

¡Estás en lo correcto! 'example'[3:4] y 'example'[3] son fundamentalmente diferentes, y el corte fuera de los límites de una secuencia (al menos para los incorporados) no causa un error.

Puede que sea sorprendente al principio, pero tiene sentido cuando lo piensas. La indexación devuelve un solo elemento, pero la segmentación devuelve una subsecuencia de elementos. Entonces, cuando intentas indexar un valor inexistente, no hay nada que devolver. Pero cuando corta una secuencia fuera de los límites, aún puede devolver una secuencia vacía.

Parte de lo que es confuso aquí es que las cadenas se comportan de manera un poco diferente a las listas. Mira lo que sucede cuando haces lo mismo en una lista:

 >>> [0, 1, 2, 3, 4, 5][3] 3 >>> [0, 1, 2, 3, 4, 5][3:4] [3] 

Aquí la diferencia es obvia. En el caso de las cadenas, los resultados parecen ser idénticos porque en Python, no existe un carácter individual fuera de una cadena. Un solo carácter es solo una cadena de 1 carácter.

(Para conocer la semántica exacta del corte fuera del rango de una secuencia, vea la respuesta de mgilson ).

Para agregar una respuesta que apunte a una sección sólida en la documentación :

Dada una expresión de división como s[i:j:k] ,

La porción de s de i a j con el paso k se define como la secuencia de elementos con índice x = i + n * k, de manera que 0 <= n <(ji) / k. En otras palabras, los índices son i, i + k, i + 2 * k, i + 3 * k y así sucesivamente, deteniéndose cuando se alcanza j (pero sin incluir j). Cuando k es positivo, i y j se reducen a len (s) si son mayores

si escribe s[999:9999] , python está devolviendo s[len(s):len(s)] ya que len(s) < 999 y su paso es positivo ( 1 - el valor predeterminado).

El corte no está controlado por los tipos incorporados. Y aunque ambos ejemplos parecen tener el mismo resultado, funcionan de manera diferente; Pruébalos con una lista en su lugar.