2012-02-28 8 views
41

¿Por qué no 'example'[999:9999] resulta en un error? Como 'example'[9] lo hace, ¿cuál es la motivación detrás de esto?¿Por qué el índice de corte de subcadena fuera de rango funciona en Python?

De este comportamiento puedo suponer que 'example'[3] es, esencialmente/internamente, no igual que 'example'[3:4], aunque ambos dan como resultado la misma cadena 'm'.

+9

'[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

+0

@Wooble esa es la respuesta real – jondavidjohn

+1

@Wooble ¿Y sabes por qué es así? Gracias por tu aclaración. – ijverig

Respuesta

5

El corte no está limitado 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.

31

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.

+1

Un índice fuera de rango podría haber devuelto 'None' en lugar de error: esa es la convención habitual de Python cuando no tiene nada que devolver. –

+3

@MarkRansom, eso es verdad; pero devolver 'Ninguno' en este caso dificultaría distinguir entre un índice fuera de límites y un valor 'Ninguno' dentro de una lista. Pero incluso si hubiera una solución para eso, me queda claro que devolver una secuencia vacía es lo correcto cuando se le da un corte fuera de límites. Es análogo a realizar la unión de dos conjuntos disjuntos. – senderle

+0

Para que quede claro, no dije que estabas equivocado. Veo tu punto acerca de los valores 'Ninguno' en una lista. –

8

En aras de la adición de una respuesta que apunta a una sección sólida en el documentation:

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

The slice of s from i to j with step k is defined as the sequence of items with index x = i + n*k such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j is reached (but never including j). When k is positive, i and j are reduced to len(s) if they are greater

si se escribe s[999:9999], pitón está volviendo s[len(s):len(s)] desde len(s) < 999 y su paso es positivo (1 - el valor predeterminado).

+0

Probablemente cuando 'k' es positivo,' i' y 'j' también se incrementan a' -len (s) 'cuando son menores? p.ej. 's = 'bac'; s [-100: 2] == s [-len (s): 2] ' –

+0

@Chris_Rands Cuando' k' es positivo, Python escalará 'i' y' j' para que se ajusten a los límites de la secuencia. En su ejemplo, 's [-100: 2] == s [0: 2]' ('== s [-len (s): 2]', por cierto). Del mismo modo, 's [-100: 100] == s [0: 2]'. – tylerc0816

Cuestiones relacionadas