我一直在经历Zed的LPTHW,在上第10课之后我一直在弄乱逃脱角色。在玩弄%r时,我遇到了这个,我不明白为什么&# 39; s发生了(我对任何形式的编程/编码都很陌生):
'10\'5"'
'10\'5"'
当我跑步时,我得到:
"10'5\"'
'10\'5"'
我很困惑。我原以为我会得到以下输出:
{{1}}
我的理解是%r会返回与它的编写方式相同的字符串,但它似乎通过向左移动\来将其转换为test_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
。这与使用双引号(" ...")或单引号(' ...')定义字符串文字的方式无关。