web-dev-qa-db-fra.com

Pourquoi le découpage de sous-chaîne avec un index hors plage fonctionne-t-il?

Pourquoi 'example'[999:9999] résultat en erreur? Puisque 'example'[9] le fait, quelle est la motivation derrière cela?

De ce comportement, je peux supposer que 'example'[3] est, essentiellement/en interne, différent de 'example'[3:4], même si les deux aboutissent au même 'm' chaîne.

81
ijverig

Vous avez raison! 'example'[3:4] et 'example'[3] sont fondamentalement différents, et le découpage en dehors des limites d'une séquence (au moins pour les fonctions intégrées) ne provoque pas d'erreur.

Cela peut être surprenant au début, mais cela a du sens quand on y pense. L'indexation renvoie un seul élément, mais le découpage renvoie une sous-séquence d'éléments. Ainsi, lorsque vous essayez d'indexer une valeur inexistante, il n'y a rien à retourner. Mais lorsque vous découpez une séquence en dehors des limites, vous pouvez toujours renvoyer une séquence vide.

Une partie de ce qui prête à confusion ici est que les chaînes se comportent un peu différemment des listes. Regardez ce qui se passe lorsque vous faites la même chose avec une liste:

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

Ici, la différence est évidente. Dans le cas des chaînes, les résultats semblent identiques car en Python, il n'y a pas de caractère individuel en dehors d'une chaîne. Un seul caractère n'est qu'une chaîne de 1 caractère.

(Pour la sémantique exacte du découpage en dehors de la plage d'une séquence, voir réponse de mgilson .)

62
senderle

Pour l'ajout d'une réponse qui pointe vers une section robuste dans le documentation :

Étant donné une expression de tranche comme s[i:j:k],

La tranche de s de i à j avec l'étape k est définie comme la séquence des éléments avec l'index x = i + n*k tel que 0 <= n < (j-i)/k. En d'autres termes, les indices sont i, i+k, i+2*k, i+3*k Et ainsi de suite, s'arrêtant lorsque j est atteint (mais sans inclure j). Lorsque k est positif, i et j sont réduits à len(s) s'ils sont supérieurs

si vous écrivez s[999:9999], python renvoie s[len(s):len(s)] depuis len(s) < 999 et votre pas est positif (1 - - le défaut).

26
mgilson

Le découpage n'est pas contrôlé par les types intégrés. Et bien que vos deux exemples semblent avoir le même résultat, ils fonctionnent différemment; essayez-les plutôt avec une liste.

7