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

时间:2014-06-06 15:36:28

标签: python string escaping backslash repr

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

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

为什么?

2 个答案:

答案 0 :(得分:59)

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

>>> 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

答案 1 :(得分:7)

正如Zero Piraeus's answer所解释的那样,使用这样的单个反斜杠(在raw string literals之外)不是一个好主意。

但是还有一个问题:将来,使用未定义的转义序列(如\d)会产生错误,而不是在字面反斜杠后面加上d。因此,与其仅仅因为您的字符串碰巧使用了\d而不是\t而幸运,而是它确实满足了您的要求,但它绝对不会满足您的要求。

从3.6开始,它已经引发了DeprecationWarning,尽管大多数人没有看到。在将来的某些版本中,它将变成SyntaxError


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

在包括Python在内的几种语言中,不开始转义序列的反斜杠就是字面反斜杠。

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