repr()
: 获取对象的可评估字符串表示形式(可以通过"eval()"进行评估,这意味着它是一个可以评估为Python对象的字符串表示形式)
换句话说:
>>> x = 'foo'
>>> repr(x)
"'foo'"
问题:
- 为什么我在使用
repr(x)
时会得到双引号("")?(当我使用str(x)
时却没有得到) - 为什么我在使用
eval("'foo'")
时会得到'foo'
而不是代表对象的变量 x?
>>> 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'
相同。
eval(repr(x)) == x
这个类比并非字面意义上的。它是一种近似,并且对于大多数(全部?)内置类型都成立,但主要的是,你可以通过查看repr
输出来获得类型和逻辑“值”的相当好的理解。repr
应该是可以传递给eval
(或复制并粘贴到您的源代码中)以产生相等值的内容,或者是在尝试这样做时会引发SyntaxError的内容(通常是由object.__repr__
生成的<...>
样式)。这在多年来逐渐被淡化,到了2.7和3.x版本中,它只是“对于许多类型”是真实的,并且即使在stdlib中也有例外情况(例如,作为本地创建的namedtuple
类型将给您一个无法eval
的repr
),但这是最初的想法。 - abarnertstr()
用于生成面向最终用户的输出,而 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()
显示了日期对象的官方表示。
1) repr('foo')
的结果是字符串 'foo'
。在你的Python shell中,表达式的结果同样以表示形式呈现,因此你实际上看到的是 repr(repr('foo'))
。
2) eval
计算表达式的结果。结果始终是一个值(例如数字、字符串或对象)。多个变量可以引用相同的值,如下所示:
x = 'foo'
y = x
x和y现在指向相同的值。
3) 我不知道你在这里的意思。你能发一个例子和你想要看到什么吗?
foo = 'bar'
baz(foo)
你没有将foo
传递给baz
函数。 foo
只是用来表示一个值的名称,在这种情况下是'bar'
,并且该值被传递给baz
函数。