Python 为什么字符串中的数字会变成“QUOTE”;x0n“;当它们前面有反斜杠时?

Python 为什么字符串中的数字会变成“QUOTE”;x0n“;当它们前面有反斜杠时?,python,string,python-3.x,Python,String,Python 3.x,我在Python3.4 shell中做了一些关于转义反斜杠的实验,发现了一些非常奇怪的事情 >>> string = "\test\test\1\2\3" >>> string '\test\test\x01\x02\x03' >>> string = "5" >>> string '5' >>> string = "5\6\7" >>> string '5\x06\x07' 正如您在上

我在Python3.4 shell中做了一些关于转义反斜杠的实验,发现了一些非常奇怪的事情

>>> string = "\test\test\1\2\3"
>>> string
'\test\test\x01\x02\x03'
>>> string = "5"
>>> string
'5'
>>> string = "5\6\7"
>>> string
'5\x06\x07'

正如您在上面的代码中所看到的,我将变量字符串定义为
“\test\test\1\2\3”
。但是,当我在控制台中输入
字符串时,它不是打印
“\test\test\1\2\3”
,而是打印
“\test\test\x01\x02\x03”
。为什么会出现这种情况,它的用途是什么?

在Python字符串文本中,
\
字符开始转义序列
\n
转换为换行符,
\t
转换为制表符等。
\xhh
十六进制序列允许您使用十六进制值生成代码点,
\uhhh
使用4位十六进制值生成代码点,
\uhhhhhh
使用8位十六进制值生成代码点

请参阅,其中包含所有可能转义序列的表格

当Python在解释器中回显字符串对象时(或者在字符串对象上使用),Python将创建字符串值的表示形式。该表示恰好使用了完全相同的Python字符串文字语法,以便更容易调试值,因为您可以使用该表示重新创建完全相同的值

为了防止不可打印字符造成破坏或根本不显示,Python使用相同的转义序列语法来表示这些字符。因此,不可打印的字节使用合适的
\xhh
序列表示,或者如果可能,使用一个
\c
单字母转义(因此换行符显示为
\n

在您的示例中,您使用
\ooo
八进制值转义序列语法创建了不可打印的字节。这些数字被解释为八进制数,以创建相应的码点。回显该字符串值时,使用默认的
\xhh
语法以十六进制表示完全相同的值:

>>> '\20' # Octal for 16
'\x10'
当您的
\t
成为制表符时:

>>> print('\test')
    est
>>> '\\test\\1\\2\\3'
'\\test\\1\\2\\3'
>>> print('\\test\\1\\2\\3')
\test\1\2\3
>>> len('\\test\\1\\2\\3')
11
注意那里没有字母
t
;相反,剩余的
est
用空白缩进,空白是一个水平选项卡

如果需要包含文字
\
反斜杠字符,则需要将字符加倍:

>>> print('\test')
    est
>>> '\\test\\1\\2\\3'
'\\test\\1\\2\\3'
>>> print('\\test\\1\\2\\3')
\test\1\2\3
>>> len('\\test\\1\\2\\3')
11
请注意,表示法使用了双反斜杠!否则,您将无法复制字符串并将其粘贴回Python以重新创建值。使用
print()
将值作为实际字符(而不是字符串表示形式)写入终端,这表明在那里有一个反斜杠,取长度表示字符串中只有11个字符,而不是15个


您还可以使用原始字符串文字。这只是一种不同的语法,根据该语法创建的字符串对象是完全相同的类型,具有相同的值。这只是拼写字符串值的另一种方式。在原始字符串文字中,反斜杠只是反斜杠,只要它们不是字符串中的最后一个字符;大多数转义序列在原始字符串文字中不起作用:

>>> r'\test\1\2\3'
'\\test\\1\\2\\3'
最后但并非最不重要的一点是,如果要在Windows系统上创建表示文件名的字符串,还可以使用正斜杠;窗口中的大多数API都不介意,并接受两种类型的斜杠作为文件名中的分隔符:

>>> 'C:/This/is/a/valid/path'
'C:/This/is/a/valid/path'
当你写作时

string = "\test\test\1\2\3"

Python认为您需要定义一个字符串,该字符串以制表符(“\t”)开始,然后是字符“e”,然后是“s”,依此类推。Python还认为您需要包含一些不可打印的字符,这些字符对应于文字数字1、2和3,速记“\1”、“\2”和“\3”提供了这些字符。

因为
\
是转义字符。而且,如果您打印(),您会看到“\t”实际上是一个制表符……您看过语言参考了吗?当你在核心语言中发现一些不符合你期望的东西时,这应该是你首先要看的地方。或者使用
r
前缀(几乎)完全禁用转义。(后面的反斜杠仍然会阻止结束引用)。啊,在结尾。“如果需要包含文字\反斜杠字符,则需要将字符加倍”部分具有误导性。对于常规字符串文字,仍然是这样。带有原始字符串文字的段落以“你也可以”开头。“大多数转义序列在原始字符串文字中不起作用”--出于我自己的好奇,这是什么?@KyleRoth:除了反斜杠引号之外,所有这些都可以看到:即使在原始文字中,引号也可以用反斜杠转义,但反斜杠仍保留在结果中。