为什么反斜杠出现两次?

问题描述 投票:0回答:2

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

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

为什么?

python string escaping backslash repr
2个回答
120
投票

您所看到的是由其 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 文档中的字符串和字节文字


15
投票

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

但是还有一个额外的问题:将来,使用像

\d
这样的未定义的转义序列将是错误的,而不是表示字面上的反斜杠后跟
d
。所以,你的字符串碰巧使用
\d
而不是
\t
所以它做了你可能想要的事情,而不是仅仅幸运,它肯定不会做你想要的事情。

从 3.6 开始,它会导致

DeprecationWarning
,尽管大多数人看不到这些。

$ python3.6 -Wall -c 'print("\d")'
<string>:1: DeprecationWarning: invalid escape sequence \d
\d

这可能会在未来的版本中成为

SyntaxError


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

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

在某些语言中,为了避免混淆该语言是类 C 还是类 Python,并避免

\Foo
工作但
\foo
不工作的问题,不启动转义序列的反斜杠是非法的.

© www.soinside.com 2019 - 2024. All rights reserved.