Pourquoi les barres obliques inverses apparaissent deux fois?
Lorsque je crée une chaîne de caractères contenant les barres obliques inverses, ils se dupliqué:
>>> my_string = "why\does\it\happen?"
>>> my_string
'why\\does\\it\\happen?'
Pourquoi?
Vous devez vous connecter pour publier un commentaire.
Ce que vous voyez est le représentation de
my_string
créée par son__repr__()
méthode. Si vous l'imprimez, vous pouvez voir que vous avez effectivement obtenu seul inverses, juste comme vous le souhaitez:La chaîne ci-dessous a trois caractères, et non pas de quatre:
Vous pouvez obtenir la représentation standard d'une chaîne de caractères (ou tout autre objet), avec la
repr()
fonction intégrée:Python représente les barres obliques inverses dans des chaînes comme
\\
parce que l'antislash est un caractère d'échappement, par exemple,\n
représente un saut de ligne, et\t
représente un onglet.Cela peut parfois vous causer des ennuis:
De ce fait, il doit y avoir un moyen de dire à Python que vous vraiment voulez les deux personnages
\n
plutôt que d'un retour à la ligne, et de vous le faire qu'en s'échappant de la barre oblique inverse, avec une autreQuand Python renvoie à la représentation d'une chaîne de caractères, il joue coffre-fort, d'échapper à toute les barres obliques inverses (même si ils n'auraient autrement pas faire partie d'une séquence d'échappement), et c'est ce que vous voyez. Cependant, la chaîne elle-même ne contient que des barres obliques inverses unique.
Plus d'informations sur Python littéraux de chaîne peut être trouvé à: Chaîne et d'Octets littéraux dans la documentation Python.
Comme Zéro réponse du Pirée explique, à l'aide de barres obliques inverses unique comme ceci (en dehors de raw les littéraux de chaîne) est une mauvaise idée.
Mais il y a un autre problème: dans l'avenir, il serait une erreur d'utiliser un indéfini séquence d'échappement comme
\d
, au lieu de la signification d'un backslash suivi par und
. Donc, au lieu de juste avoir de la chance que votre chaîne est arrivé d'utiliser\d
au lieu de\t
ainsi, il a fait ce que vous avez probablement voulu, il va certainement pas faire ce que vous voulez.Que de 3,6, il soulève déjà un
DeprecationWarning
, bien que la plupart des gens ne les voit pas. Il deviendra unSyntaxError
dans une version future.Dans de nombreuses autres langues, y compris C, à l'aide d'une barre oblique inverse qui n'est pas le début d'une séquence d'échappement signifie que la barre oblique inverse est ignoré.
Dans quelques langues, y compris Python, une barre oblique inverse qui n'est pas le début d'une séquence d'échappement est un backslash.
Dans certaines langues, pour éviter toute confusion quant à savoir si la langue est en C ou en Python, et pour éviter le problème avec
\Foo
de travail mais\foo
pas de travail, une barre oblique inverse qui n'est pas le début d'une séquence d'échappement est illégal.