Pourquoi ne sous-chaîne de découpage avec l'index hors de portée?

Pourquoi ne pas 'example'[999:9999] entraîner dans l'erreur? Depuis 'example'[9] fait, quelle est la motivation qui est derrière?

De ce comportement, je peux supposer que 'example'[3] est, en substance/à l'interne, pas le même que 'example'[3:4], même si les deux résultats dans le même 'm' chaîne.

  • [999:9999] n'est pas un indice, c'est une tranche, et ont des sémantiques différentes. À partir du python intro: "Dégénéré tranche indices sont traitées correctement: un index qui est trop grand est remplacée par la taille de la chaîne, une limite supérieure plus petite que la limite inférieure retourne une chaîne vide."
  • c'est la réponse exacte
  • Et savez-vous pourquoi c'est de cette façon? Je vous remercie pour vos éclaircissements.
  • Pourquoi? Vous devriez demander à Guido, mais je pense que c'est élégant pour être en mesure d'assumer une tranche est toujours le même type de séquence de la séquence d'origine, moi-même.
  • Yep, c'est vrai. Je pense que j'ai mal compris [a:b] comme si c'était un [a..b] genre de chose...
  • Quelqu'un a effectivement utilisé ce comportement dans le code réel? Tranches de représenter un sous-ensemble de listes d'index et par définition un sous-ensemble est inclus dans l'ensemble. Pour moi, si foo = [0,1,2,3] et je tranche foo[-42:1337] qu'il ressemble plus à un bug que comme une intention de le trancher. La chose est que nous avons eu de merveilleux objets pour signaler un bug pour l'utilisateur: les exceptions. Peut-être que cette idée a été empruntée à partir de php...
  • oui, j'ai écrit un code qui dépend de ce comportement. Malheureusement je ne me souviens pas le code exact donc je ne peux pas vous dire pourquoi. Probablement eu à faire avec des sous-chaînes d'obtenir une chaîne vide peut être exactement ce que vous voulez à la fois.
  • Je pense que sous-ensemble n'est pas tout à fait droit. "Intersection" serait plus correct, et selon que l'idiome de ce comportement fait beaucoup de sens. J'ai utilisé fréquemment, dans le cas où je veux effectuer une itération sur une sous-suite qui peut ou ne peut pas exister. Si la liste vide est retourné, le bloc n'a pas l'exécuter du tout. Cela permet d'économiser au moins un et souvent deux ou trois explicite si les déclarations, et évite la surcharge de la gestion des exceptions dans les boucles serrées.

InformationsquelleAutor ijverig | 2012-02-28