为什么\ x00不能被repr转换为\ 0

时间:2018-10-19 16:37:18

标签: python repr

关于Python的代表,这是一个有趣的怪胎:

制表符\x09表示为\t。但是,此约定不适用于空终止符。

为什么\x00代表\x00而不是\0

示例代码:

# Some facts to make sure we are on the same page
>>> '\x31' == '1'
True
>>> '\x09' == '\t'
True
>>> '\x00' == '\0'
True

>>> x = '\x31'
>>> y = '\x09'
>>> z = '\x00'
>>> x
'1' # As Expected
>>> y
'\t' # Okay
>>> z
'\x00' # Inconsistent - why is this not \0

2 个答案:

答案 0 :(得分:5)

简短的答案:因为这不是 使用的特定转义符。字符串表示形式仅使用单字符转义符\\\n\r\t,(同时\'和{{ 1}}个字符),因为有针对这些字符的显式测试。

其余的被视为可打印并按原样包含,或使用更长的转义序列包含(取决于Python版本和字符串类型"'\xhh,总是使用最适合该值的3个选项中的最短的一个。)

此外,在生成\uhhhh输出时,对于由空字节后跟 digit 的字符串组成的字符串从\Uhhhhhhhhrepr()(因此{ {1}}或'1'等),您不能只在输出中使用'7',而不必先转义以下数字。 bytes([0x00, 0x49])是一个八进制转义序列,与bytes([0x00, 0x4A])的值(两个字节)不同。虽然可以强制输出始终使用三个八进制数字(例如\0),但是要坚持使用标准化,更简单的转义序列格式会更简单。向前扫描以查看下一个字符是否为八进制数字并切换输出样式只会产生令人困惑的输出(想象一下SO上的问题: '\01''\x001'之间有什么区别?

输出 始终是一致的。除了单引号(可以使用'\0001''\x001'出现,具体取决于'\0Ol'字符)之外,Python始终会使用相同的转义序列样式给定的代码点。

如果您想研究产生输出的代码,可以在Objects/unicodeobject.c unicode_repr() function中找到Python 3 '的实现,该实现使用

\'

用于单字符转义符,后面是其他检查,用于更长的转义符。对于Python 2,similar but shorter PyString_Repr() function的作用大致相同。

答案 1 :(得分:3)

如果尝试使用/* Escape quotes and backslashes */ if ((ch == quote) || (ch == '\\')) { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, ch); continue; } /* Map special whitespace to '\t', \n', '\r' */ if (ch == '\t') { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 't'); } else if (ch == '\n') { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 'n'); } else if (ch == '\r') { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 'r'); } ,则必须在数字紧跟其后的情况下进行特殊处理,以防止将它们解释为八进制文字。始终使用System.Environment.NewLine 更简单而且总是正确的。