¿Por qué no da como 'example'[999:9999]
resultado un error? Dado 'example'[9]
que lo hace, ¿cuál es la motivación detrás de esto?
A partir de este comportamiento, puedo suponer que 'example'[3]
, esencialmente / internamente, no es lo mismo que 'example'[3:4]
, aunque ambos dan como resultado la misma 'm'
cadena.
[999:9999]
no es un índice, es un segmento y tiene una semántica diferente. De 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 la cadena, un límite superior más pequeño que el límite inferior devuelve una cadena vacía".Respuestas:
¡Estás en lo correcto!
'example'[3:4]
y'example'[3]
son fundamentalmente diferentes, y cortar fuera de los límites de una secuencia (al menos para elementos integrados) no causa un error.Puede resultar sorprendente al principio, pero tiene sentido cuando se piensa en ello. La indexación devuelve un solo elemento, pero la divisió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 un poco diferente a las listas. Mira lo que pasa cuando haces lo mismo con 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 de cortar fuera del rango de una secuencia, consulte la respuesta de mgilson ).
fuente
None
lugar de generar un error; esa es la convención habitual de Python cuando no tiene nada que devolver.None
en este caso haría más difícil distinguir entre un índice fuera de límites y unNone
valor dentro de una lista. Pero incluso si hubiera una solución para eso, queda claro para mí que devolver una secuencia vacía es lo correcto cuando se le da un segmento fuera de los límites. Es análogo a realizar la unión de dos conjuntos disjuntos.None
valores en una lista.Por el simple hecho de agregar una respuesta que apunte a una sección sólida en la documentación :
Dada una expresión de corte como
s[i:j:k]
,si escribe
s[999:9999]
, Python está regresandos[len(s):len(s)]
desdelen(s) < 999
y su paso es positivo (1
- el predeterminado).fuente
k
es positivoi
yj
también aumenta a-len(s)
cuando son menores? por ejemplos = 'bac'; s[-100:2] == s[-len(s):2]
k
sea positivo, Python escalarái
yj
se ajustará a los límites de la secuencia. En tu ejemplo,s[-100:2] == s[0:2]
(== s[-len(s):2]
, por cierto). Del mismo modo,s[-100:100] == s[0:2]
.Los tipos integrados no comprueban los límites del corte. Y aunque ambos ejemplos parecen tener el mismo resultado, funcionan de manera diferente; pruébelos con una lista.
fuente