2
#Combine %r with double-quote and single-quote escapes and print them out. 
#Compare %r with %s. Notice how %r prints it the way you'd write it in your file, 
#but %s  prints it the way you'd like to see it?

这是我为练习写的:

1) mybugs1 = "Guido said: %r and moved on." %'I \'love\' \"my\" bugs'

2) mybugs2 = "Stallman said: %s and moved on." % 'I \'love\' \"my\" bugs'

3) print mybugs1

4) print mybugs2 

输出

Guido said: 'I \'love\' "my" bugs' and moved on.

Stallman said: I 'love' "my" bugs and moved on.

问题

%r 不会像我在 .py 文件中那样打印所有内容(例如,它在第 1 行打印“my”而不是“my”)。为什么?

4

2 回答 2

3

有几种方法可以在 python 中编写字符串文字,使用单引号或双引号、单行或多行、原始或正常。但是,这些都没有保留在字符串本身中;一旦解析器解析它,就没有关于它如何在源中呈现的信息;它甚至不需要在源代码中,您可以动态生成字符串,例如,通过从文件中读取它、询问用户或将数字转换为字符串。

因此,当您repr()输入一个字符串时,python会猜测以哪种方式格式化它以使其看起来像一个文字。它使用的规则很简单,如果字符串包含单引号但没有双引号,则使用单行、双引号、非原始文字;在所有其他情况下,它使用单行、单引号、非原始文字;换句话说,python 更喜欢单引号,但如果它正在格式化一个有单引号但没有双引号的字符串,它可以repr()使用双引号字符串而不用反斜杠转义引号。

请记住,repr()它不会返回您输入的内容,因为它不知道您输入的内容;您可能永远不会全部输入。它返回可以解析回相同值的内容。身份*是:

x == eval(repr(x))

不是

x == repr(eval(x))

*repr()对此也不神奇,并非所有对象都__repr__以保留此约束的方式实现。repr 主要用于提供有用的调试信息,而不是用于生成 python 代码

于 2011-10-17T10:05:37.097 回答
2

单引号内的双引号不必转义,反之亦然。

解析器删除反斜杠。

例子

>>> s = 'I \'love\' \"my\" bugs'
>>> s
'I \'love\' "my" bugs'
>>> 
于 2011-10-17T08:49:59.267 回答