Answers:
>>> x = 'foo'
>>> x
'foo'
因此,名称x
将附加到'foo'
字符串。例如repr(x)
,当您致电时,解释器放'foo'
而不是,x
然后致电repr('foo')
。
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
实际调用一个魔术方法__repr__
的x
,这给串包含该值的表示'foo'
分配给x
。因此它会'foo'
在字符串内返回""
结果"'foo'"
。的想法repr
是给出一个包含一系列符号的字符串,我们可以在解释器中键入该符号,并获得与作为参数发送给的相同值repr
。
>>> eval("'foo'")
'foo'
调用时eval("'foo'")
,与'foo'
在解释器中键入的相同。就像我们""
在解释器中直接键入外部字符串的内容一样。
>>> eval('foo')
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
eval('foo')
File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
如果调用eval('foo')
,则与foo
在解释器中键入的相同。但是没有foo
可用的变量,并且引发了异常。
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
str
只是对象的字符串表示形式(请记住,x
变量是指'foo'
),因此此函数返回字符串。
>>> str(5)
'5'
整数的字符串表示形式5
是'5'
。
>>> str('foo')
'foo'
并且字符串的字符串表示形式'foo'
是相同的字符串'foo'
。
您在交互式解释器上获得的反馈也将使用repr
。当您键入表达式(顺便说一句expr
)时,解释器基本上会执行result = expr; if result is not None: print repr(result)
。因此,在您的例子中,第二行是格式化字符串foo
为表示你要('foo'
)。然后解释创建repr
的esentation 说,让你用双引号。
为什么当我将%r与双引号和单引号转义结合使用并打印出来时,它以我将其写入.py文件的方式而不是我希望看到的方式打印出来?
我不确定您在这里问什么。文本single ' and double " quotes
在运行时repr
,包含一种引号的转义符。当然可以,否则Python规则将不是有效的字符串文字。这正是您要求通过致电repr
。
还要注意,eval(repr(x)) == x
类推并非字面意思。这是一个近似值,适用于大多数(所有?)内置类型,但主要的是,通过查看repr
输出,您可以很好地了解类型和逻辑“值” 。
repr
都应该是可以传递给eval
(或复制并粘贴到您的源代码中)以产生相等值的东西,或者是尝试时会产生SyntaxError的东西(通常是<…>
产生的样式object.__repr__
。多年来,这种情况逐渐被淡化,直到2.7和3.x才是“许多类型”,甚至在stdlib中也有例外(例如,namedtuple
创建为本地类型的类型将为您提供“ repr
您可以” t eval
),但这是最初的想法。