Pourquoi n'entraîne pas 'example'[999:9999]
d'erreur? Depuis 'example'[9]
, quelle est la motivation derrière cela?
À partir de ce comportement, je peux supposer que 'example'[3]
, essentiellement / en interne, ce n'est pas la même chose que 'example'[3:4]
, même si les deux aboutissent à la même 'm'
chaîne.
[999:9999]
n'est pas un index, c'est une tranche et a une sémantique différente. Extrait de l'intro de python: "Les indices de tranche dégénérée sont gérés avec élégance: un index trop grand est remplacé par la taille de la chaîne, une limite supérieure plus petite que la limite inférieure renvoie une chaîne vide."Réponses:
Tu as 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 éléments intégrés) ne provoque pas d'erreur.Cela peut paraître surprenant au début, mais c'est logique 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 est déroutant 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 sur 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'existe pas de caractère individuel en dehors d'une chaîne. Un seul caractère est juste 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 la réponse de mgilson .)
la source
None
au lieu d'erreur - c'est la convention Python habituelle lorsque vous n'avez rien à retourner.None
dans ce cas rendrait plus difficile la distinction entre un index hors limites et uneNone
valeur à l'intérieur d'une liste. Mais même s'il y avait une solution de contournement pour cela, il me semble clair que renvoyer une séquence vide est la bonne chose à faire lorsqu'on lui donne une tranche hors limites. C'est analogue à la réalisation de l'union de deux ensembles disjoints.None
valeurs dans une liste.Pour ajouter une réponse qui pointe vers une section robuste de la documentation :
Étant donné une expression de tranche comme
s[i:j:k]
,si vous écrivez
s[999:9999]
, python revients[len(s):len(s)]
depuislen(s) < 999
et votre étape est positive (1
- la valeur par défaut).la source
k
est-il positif,i
etj
est-il également augmenté jusqu'à-len(s)
quand ils sont moindres? egs = 'bac'; s[-100:2] == s[-len(s):2]
k
est positif, Python sera mis à l'échellei
etj
pour qu'ils correspondent aux limites de la séquence. Dans votre exemple,s[-100:2] == s[0:2]
(== s[-len(s):2]
, au fait). De même,s[-100:100] == s[0:2]
.Le découpage n'est pas vérifié par les limites des 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.
la source