80

当我创建一个包含反斜杠的字符串时,它们会被重复:

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

为什么?

4

2 回答 2

109

你看到的是由它的方法创建的表示如果你打印它,你可以看到你实际上有一个反斜杠,就像你想要的那样:my_string__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 文档中的字符串和字节文字

于 2014-06-06T15:36:28.457 回答
15

正如零比雷埃夫斯的回答所解释的那样,使用这样的单反斜杠(在原始字符串文字之外)是一个坏主意。

但是还有一个额外的问题:将来,使用未定义的转义序列(如\d,而不是表示文字反斜杠后跟 . )将是错误的d。所以,与其幸运的是你的字符串碰巧使用了它,\d而不是\t它做了你可能想要的,它肯定不会做你想要的。

从 3.6 开始,它已经提出了 aDeprecationWarning,尽管大多数人没有看到这些。它将成为SyntaxError未来的某个版本。


在包括 C 在内的许多其他语言中,使用不启动转义序列的反斜杠意味着反斜杠被忽略。

在包括 Python 在内的一些语言中,不以转义序列开头的反斜杠是文字反斜杠。

在某些语言中,为了避免混淆该语言是类 C 还是类 Python,以及避免\Foo工作但\foo不工作的问题,不启动转义序列的反斜杠是非法的。

于 2018-08-21T07:38:24.187 回答