Python中repr()函数的理解

161

repr(): 获取对象的可评估字符串表示形式(可以通过"eval()"进行评估,这意味着它是一个可以评估为Python对象的字符串表示形式)

换句话说:

>>> x = 'foo'
>>> repr(x)
"'foo'"

问题:

  1. 为什么我在使用 repr(x) 时会得到双引号("")?(当我使用 str(x) 时却没有得到)
  2. 为什么我在使用 eval("'foo'") 时会得到 'foo' 而不是代表对象的变量 x?
5个回答

172
>>> x = 'foo'
>>> x
'foo'

因此,名称x与字符串'foo'相关联。 当您调用repr(x)时,解释器将在x的位置放置'foo',然后调用repr('foo')

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr实际上调用了x的魔术方法__repr__,该方法返回包含赋给x的值'foo'字符串。因此,它在""字符串中返回'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函数的情况?我无法理解。 - Gaurav Parashar

14
交互式解释器返回的反馈也使用了`repr`。当您输入表达式(假设为`expr`)时,解释器基本上执行`result = expr; if result is not None: print repr(result)`。因此,您示例中的第二行实际上是将字符串`foo`格式化为所需的表示形式(`'foo'`)。然后解释器创建该表示形式的`repr`,留下双引号。 >“为什么当我将%r与单引号和双引号转义组合在一起并打印它们时,它打印出我在.py文件中编写的方式,但不是我想看到的方式?”
我不确定您在这里问的是什么。文本`single ' and double " quotes`,经过`repr`处理,包括一种引号的转义。当然,否则它就不符合Python规则的有效字符串文字。这正是您通过调用`repr`要求的。
请注意,eval(repr(x)) == x 这个类比并非字面意义上的。它是一种近似,并且对于大多数(全部?)内置类型都成立,但主要的是,你可以通过查看repr输出来获得类型和逻辑“值”的相当好的理解。

2
最初,它实际上是要字面的:每个值的repr应该是可以传递给eval(或复制并粘贴到您的源代码中)以产生相等值的内容,或者是在尝试这样做时会引发SyntaxError的内容(通常是由object.__repr__生成的<...>样式)。这在多年来逐渐被淡化,到了2.7和3.x版本中,它只是“对于许多类型”是真实的,并且即使在stdlib中也有例外情况(例如,作为本地创建的namedtuple类型将给您一个无法evalrepr),但这是最初的想法。 - abarnert

9

str() 用于生成面向最终用户的输出,而 repr() 则用于开发过程中的调试。它是该对象的官方表示。

例如:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

从输出结果可以看出,repr()显示了日期对象的官方表示。


4

1) repr('foo') 的结果是字符串 'foo'。在你的Python shell中,表达式的结果同样以表示形式呈现,因此你实际上看到的是 repr(repr('foo'))

2) eval 计算表达式的结果。结果始终是一个值(例如数字、字符串或对象)。多个变量可以引用相同的值,如下所示:

x = 'foo'
y = x

x和y现在指向相同的值。

3) 我不知道你在这里的意思。你能发一个例子和你想要看到什么吗?


2
当你说
foo = 'bar'
baz(foo)

你没有将foo传递给baz函数。 foo只是用来表示一个值的名称,在这种情况下是'bar',并且该值被传递给baz函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接