8
votes

vide_string dans certains_string - toujours vrai?

Dupliqué possible:
Pourquoi la chaîne vide est sur chaque chaîne?

Je me demande pourquoi Python retourne vrai chaque fois que je vérifie si la chaîne vide est dans une chaîne et pourquoi son index est zéro.

Par exemple:

  • '' in '' => vrai
  • ''. index ('') => 0
  • '' dans 'Notempty' => vrai
  • 'notempty'.index (' ') => 0

    Je l'ai remarqué lorsque j'écrivais une fonction ROT13 et je l'ai testé, j'ai trouvé que lorsque je l'appelle sur une chaîne vide, il renvoie 'n' ( 'n' / code> est index13 dans l'alphabet).


0 commentaires

3 Réponses :


6
votes

Une autre façon de regarder c'est que x en y devrait renvoyer true s'il est possible de trouver deux chaînes s1 et S2 tel que ce qui suit détient: xxx

lorsque x est la chaîne vide qu'il donnera toujours vrai . C'est parce que vous pouvez choisir s1 = '' et s2 = y .

bien sûr la mise en œuvre réelle de dans Ne fonctionne pas de cette manière, mais le résultat est le même. Cela obtient simplement cela de manière plus efficace.


0 commentaires

6
votes

une chaîne s est une sous-chaîne de la chaîne t si et seulement s'il existe un index i tel que t [ I: I + Len (s)] == s . Lorsque s est la chaîne vide que vous avez t [i: i] = '' = s de sorte que tous les résultats sont corrects.

Notez également que t .index ('') renvoie 0 parce que index renvoie le premier index dans lequel la sous-chaîne apparaît et t [0: 0] = '' c'est donc définitivement le résultat correct.

En résumé, la chaîne vide est une sous-chaîne de chaque chaîne, et tous ces résultats sont une conséquence directe de cela.

Notez également que cela est particulièrement Les cordes, car les cordes sont des séquences de caractères, qui sont elles-mêmes des cordes de longueur une. Pour d'autres types de séquences (telles que la liste s ou tuple s) Vous n'obtenez pas les mêmes résultats: xxx

C'est parce que list et tuple uniquement vérifier pour les membres et non pour la liste des sous- s ou sous- tuple s, parce que leurs éléments peuvent être de type arbitraire. Imaginez le cas ((1,2), 1,2) .index (((1,2)) . Devrait-il index Vérifier les "sous-tuples" (et donc renvoyer 1), pour les membres (et renvoyer donc 0) ou faire un certain mélange laid (par exemple, vérifiez d'abord des sous-utilles, puis pour les membres)? En Python, il a été décidé de rechercher uniquement des membres, car il est plus simple et que c'est généralement ce que vous voulez. Vérification des sous-tuples uniquement donnerait des résultats vraiment étranges dans le cas général et faire des "mélanges" donnerait souvent des résultats imprévisibles.


5 commentaires

Plus généralement, index renvoie la valeur de démarrage si elle est inférieure ou égale à la longueur de la chaîne: 'spam'.index (' '', 4) == 4 . Mais 'spam'.index (' ', 5) lève un ValueError .


@ Syeryksun Je considérerais qu'un bug. Le trouver DOC indique: renvoyer l'index le plus bas de S où le sous-chaîne est trouvé, tel que SUB est contenu dans S [Démarrer: fin]. Les arguments facultatifs Début et la fin sont interprétés comme dans la notation des tranches. Donc, le ValueError semble incompatible à moi (l'index DOC fait simplement des points sur trouver 's).


Je suppose que tu as raison. Si une sous-chaîne est dans la tranche correspondante, alors trouver doit renvoyer le premier index.


Je pense que cela convient de noter que ce comportement est propre à des cordes, car les sous-chaînes (et même des caractères simples ou des chaînes vides) sont toujours des cordes alors que les éléments uniques d'autres types de données ne sont pas garantis comme étant le même type. par exemple. MyTupple [0] n'est généralement pas un tuple.


@MGILSON Oui, c'est ce que je voulais dire. Je vais éditer mon message pour le rendre plus clair.



0
votes

Eh bien, la réponse est vraiment simple. Vous recherchez "" qui vraiment, n'est pas un personnage du tout ....

Et la première fois qu'il n'y a pas de caractère dans une chaîne, c'est juste au début ... à [0]

Il devient déroutant, car vous penseriez que [0] est l'index du premier caractère. C'est vrai, mais vous devez également penser que dans ce cas, les segments entre les personnages sont aussi quelque chose de "tangible" et, bien sûr, rien n'est dans quelque chose, c'est aussi dans rien. Et si vous voulez vérifier les sous-ensembles d'une chaîne, vous le trouverez n'importe où que vous avez choisi, dans le premier lieu possible.


0 commentaires