当我创建一个包含反斜杠的字符串时,它们会重复:
>>> my_string = "why\does\it\happen?"
>>> my_string
'why\\does\\it\\happen?'
为什么?
你看到的是my_string
的
representation,由它的
__repr__()
方法创建。如果你打印它,你可以看到你实际上有一个反斜杠,就像你想要的那样:
>>> print(my_string)
why\does\it\happen?
下面的字符串中有 三个 个字符,而不是四个:
>>> '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 你 真的 想要两个字符
\n
而不是换行符,你可以通过转义反斜杠本身来做到这一点,还有另一个:
>>> print("this\\text\is\what\you\\need")
this\text\is\what\you\need
当 Python 返回字符串的表示时,它会安全地转义所有反斜杠(即使它们不会以其他方式成为转义序列的一部分),这就是您所看到的。但是,字符串本身只包含一个反斜杠。
有关 Python 字符串文字的更多信息,请参见:Python 文档中的 String and Bytes literals。
正如 Zero Piraeus 的回答 所解释的那样,使用像这样的单反斜杠(在 raw string literals 之外)是一个坏主意。
但是还有一个额外的问题:在未来,使用像
\d
这样的未定义的转义序列,而不是字面上的反斜杠后跟d
,将是一个错误。所以,你的字符串碰巧使用 \d
而不是 \t
而不是幸运,所以它做了你可能想要的,它肯定不会做你想要的。
截至 3.6,它已经提出了一个
DeprecationWarning
,尽管大多数人没有看到这些。 在未来的某个版本中它会变成SyntaxError
在许多其他语言中,包括 C,使用不开始转义序列的反斜杠意味着反斜杠被忽略。
在包括 Python 在内的一些语言中,不以转义序列开头的反斜杠是字面反斜杠。
在某些语言中,为了避免混淆该语言是类 C 还是类 Python,以及避免
\Foo
有效但 \foo
无效的问题,没有开始转义序列的反斜杠是非法的.