Python:为什么%r不能准确地表示\"上的原始数据?与\'

时间:2016-03-08 04:29:24

标签: python

我一直在经历Zed的LPTHW,在上第10课之后我一直在弄乱逃脱角色。在玩弄%r时,我遇到了这个,我不明白为什么&# 39; s发生了(我对任何形式的编程/编码都很陌生):

'10\'5"'
'10\'5"'

当我跑步时,我得到:

"10'5\"'
'10\'5"'

我很困惑。我原以为我会得到以下输出:

{{1}}

我的理解是%r会返回与它的编写方式相同的字符串,但它似乎通过向左移动\来将其转换为test_2。

我在这里错过了什么吗?

感谢。

2 个答案:

答案 0 :(得分:5)

  

据我所知,%r会返回与其编写方式相同的字符串

您的理解不正确。 Python不会记得"如何在源代码中写入字符串;对解释者来说最重要的是它包含了字符:

10'5"

打印该字符串的repr将使用Python认为最适合其内容的任何类型的引号。由于两个字符串都包含相同的字符,因此它们的编号相同repr(因此,%r格式字符串)。

答案 1 :(得分:0)

Python字符串文字或常量可以使用单引号(')或双引号(")开头。当它以单引号(')开头时,它必须以带单引号(')的结尾。

类似的逻辑用于字符串文字或常量以双引号(")开头。如果它以双引号(")开头,那么它必须以相同的双引号结束(")。

现在要注意的有趣的事情是:如果字符串文字或常量以双引号(")开头,则该字符串文字中的单引号(')只是另一个字符。您不需要使用转义字符(\)来告诉Python解释器保留单引号(')完整。

类似的逻辑用于以单引号(')开头的字符串文字或常量,然后该字符串文字中的双引号(")只是另一个字符。您不需要设置转义字符(\)来告诉Python解释器保持双引号(")完好无损。

因此,在下面的代码片段中,您使用字符串文字或常量初始化变量test。您通过双引号定义了字符串常量(" ...")。在你的字符串常量里面,你输入两个数字(10),一个单引号('),数字(5)和一个双引号(需要通过转义字符转义)。

您在以下代码片段中对变量test_2执行了相同的操作。但是在这里你使用单引号(' ...')定义了你的字符串文字或常量,所以你需要在前两位数之后转义单引号(')(10 )。

test = "10'5\""   
test_2 = '10\'5"'

print "%r" % test
print "%r" % test_2 

如果使用打印格式%s而不是原始格式%r打印变量,则两个变量将获得相同的字符串文字或常量值,即:{{ 1}}

10'5"

但是对于两个Python字符串变量print "%s" % test print "%s" % test_2 %r的原始格式test值,Python解释器在内部选择代表您的原始字符串值,以单个字符开头和结尾引用,并打印为:test_2。这与使用双引号(" ...")或单引号(' ...')定义字符串文字的方式无关。