为什么使用%r的这两个输出之间的差异是python中的单引号和双引号

med*_*ter 1 python

binary = "binary"
do_not = "don't"
x = "There are %s types of people." % binary
y = "Those who know %s and those who %s." % (binary, do_not)

print "I also said: %r." % y
print "I also said: %r." % x   
Run Code Online (Sandbox Code Playgroud)

这是学习Python的练习.我正在尝试理解'%r',所以我尝试了上面的两个版画.输出是

I also asid: "Those who know binary and those who don't.".
I also said: 'There are binary types of people.'.
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么这两个印刷品之间的区别是双引号和单引号?谢谢你的帮助.

Ruf*_*ind 6

%r格式将导致使用Python中的打印repr功能.所以以下是等价的:

"%r" % my_string  ?  "%s" % repr(my_string)
Run Code Online (Sandbox Code Playgroud)

那么问题就变成了,为什么repr有时会使用单引号,有时会使用双引号?嗯,首先,目标repr是生成一个Python对象的表示,它也是有效的Python源代码(这不是强制性要求,但对于许多Python类型它确实有效).对于包含撇号的字符串,有多种方式来表示它:

"Don't"  ?  'Don\'t'
Run Code Online (Sandbox Code Playgroud)

repr决定是"聪明的"并选择一个更容易阅读的,即使用双引号,只要它不包含双引号.在所有其他情况下,Python回退到默认的单引号.这就是为什么您会看到不同字符串的不同行为.

更相关的是,不要依赖repr(或%r)引用字符串供人类消费,为此编写自己的函数.它并不意味着它,它主要用作在调试时转储Python对象的便捷方式.

AFAIK没有明确规定你repr在弦乐时会得到什么的文件,除非eval(repr(my_string)) == my_string预期会成立.