web-dev-qa-db-ja.com

バックスラッシュが2回現れるのはなぜですか?

バックスラッシュを含む文字列を作成すると、それらが重複します:

>>> my_string = "why\does\it\happen?"
>>> my_string
'why\\does\\it\\happen?'

どうして?

44
Zero Piraeus

あなたが見ているのは、 __repr__() メソッドによって作成された_my_string_のrepresentationです。それを印刷すると、意図したとおりに、実際に単一のバックスラッシュがあることがわかります。

_>>> print(my_string)
why\does\it\happen?
_

以下の文字列には、4つではなく3つの文字が含まれています。

_>>> 'a\\b'
'a\\b'
>>> len('a\\b')
3
_

repr() 組み込み関数を使用して、文字列(またはその他のオブジェクト)の標準表現を取得できます。

_>>> print(repr(my_string))
'why\\does\\it\\happen?'
_

Pythonは文字列内のバックスラッシュを_\\_として表します。バックスラッシュはエスケープ文字であるためです。たとえば、_\n_は改行を表し、_\t_はタブを表します。

これは時々あなたをトラブルに巻き込む可能性があります:

_>>> print("this\text\is\not\what\it\seems")
this    ext\is
ot\what\it\seems
_

このため、Python youreallyが2文字を必要とすることを伝える方法が必要です_\n_改行ではなく、別のバックスラッシュを使用して、バックスラッシュ自体をエスケープすることでそれを行います。

_>>> print("this\\text\is\what\you\\need")
this\text\is\what\you\need
_

Pythonが文字列の表現を返すとき、それはエスケープシーケンスの一部ではない場合でも)すべてのバックスラッシュをエスケープして安全に再生され、それがあなたが見ているものです。 、文字列自体には単一のバックスラッシュのみが含まれます。

Pythonの文字列リテラルの詳細については、次のURLを参照してください。 String and Bytes literals in Python documentation。

62
Zero Piraeus

Zero Piraeusの答え が説明するように、このような単一のバックスラッシュ( raw文字列リテラル の外側)を使用するのは悪い考えです。

しかし、追加の問題があります。将来的には、リテラルバックスラッシュの後にdが続くのではなく、\dのような未定義のエスケープシーケンスを使用するとエラーになります。そのため、文字列が\dの代わりに\tを使用したことが幸運なだけでなく、おそらく望んでいたことをしたので、間違いなく望みどおりにはなりません。

3.6の時点で、すでにDeprecationWarningが発生しますが、ほとんどの人はそれらを表示しません。将来のバージョンではSyntaxErrorになります。


Cを含む他の多くの言語では、エスケープシーケンスを開始しないバックスラッシュを使用すると、バックスラッシュが無視されます。

Pythonを含むいくつかの言語では、エスケープシーケンスを開始しないバックスラッシュはリテラルバックスラッシュです。

一部の言語では、言語がCライクかPythonライクかに関する混乱を避け、\Fooは機能するが\fooが機能しないという問題を回避するために、エスケープを開始しないバックスラッシュシーケンスは違法です。

7
abarnert