为什么反斜杠会出现两次?

Zer*_*eus 46 python string escaping repr backslash

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

>>> my_string = "why\does\it\happen?"
>>> my_string
'why\\does\\it\\happen?'
Run Code Online (Sandbox Code Playgroud)

为什么?

Zer*_*eus 66

你们看到的是代表my_string由它的创建__repr__()方法.如果你打印它,你可以看到你实际上有一个反斜杠,就像你想要的那样:

>>> print(my_string)
why\does\it\happen?
Run Code Online (Sandbox Code Playgroud)

下面的字符串中有三个字符,而不是四个字符:

>>> 'a\\b'
'a\\b'
>>> len('a\\b')
3
Run Code Online (Sandbox Code Playgroud)

您可以使用repr()内置函数获取字符串(或任何其他对象)的标准表示:

>>> print(repr(my_string))
'why\\does\\it\\happen?'
Run Code Online (Sandbox Code Playgroud)

Python在字符串中表示反斜杠,\\因为反斜杠是转义字符 - 例如,\n表示换行符,\t表示选项卡.

这有时会让你陷入困境:

>>> print("this\text\is\not\what\it\seems")
this    ext\is
ot\what\it\seems
Run Code Online (Sandbox Code Playgroud)

因此,需要有一种方法告诉Python你真的想要两个字符\n而不是换行符,并且你通过转义反斜杠本身来做到这一点,另外一个:

>>> print("this\\text\is\what\you\\need")
this\text\is\what\you\need
Run Code Online (Sandbox Code Playgroud)

当Python返回字符串的表示时,它会安全地播放,转义所有反斜杠(即使它们不会成为转义序列的一部分),这就是你所看到的.但是,字符串本身只包含单个反斜杠.

有关Python字符串文字的更多信息,请参阅Python文档中的String和Bytes文字.

  • 我试图将这个答案专注于"双反斜杠"误解,但了解[原始字符串文字](http://stackoverflow.com/questions/2081640)也很有用. (3认同)

aba*_*ert 8

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

但是还有一个问题:在将来,使用未定义的转义序列将是一个错误\d,而不是意味着后跟一个字面反斜杠d.所以,而不是只是幸运的是你的字符串碰巧使用\d而不是\t它做了你想要的,它绝对不会做你想要的.

截至3.6,它已经提出了一个DeprecationWarning,虽然大多数人都没有看到这些.它将成为SyntaxError未来的某个版本.


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

在一些语言(包括Python)中,不启动转义序列的反斜杠是字面反斜杠.

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


归档时间:

查看次数:

13525 次

最近记录:

7 年,1 月 前