了解Python中的repr()函数
repr()
:可评估的对象的string表示forms(可以是“eval()”it,表示它是一个string表示forms,用于计算Python对象)
换一种说法:
>>> x = 'foo' >>> repr(x) "'foo'"
问题:
- 当我做
repr(x)
时,为什么我会得到双引号? (当我做str(x)
时,我不会得到它们) - 为什么当我做
eval("'foo'")
而不是x是哪个对象'foo'
时候会得到'foo'
?
>>> x = 'foo' >>> x 'foo'
所以名字x
被附加到'foo'
string。 当你打电话给例子repr(x)
,解释器放置'foo'
而不是x
,然后调用repr('foo')
。
>>> repr(x) "'foo'" >>> x.__repr__() "'foo'"
repr
实际上调用了x
的magic方法__repr__
,它给出了包含赋值给x
的值'foo'
表示的string 。 所以它在string""
返回'foo'
""
结果是"'foo'"
。 repr
的思想是给出一个string,其中包含一系列我们可以在解释器中input的符号,并获得相同的值作为参数发送给repr
。
>>> eval("'foo'") 'foo'
当我们调用eval("'foo'")
,就和我们在解释器中input'foo'
。 这是因为我们直接在解释器中input外部string""
的内容。
>>> 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')
,就和我们在解释器中inputfoo
一样。 但没有可用的foo
variables,并引发exception。
>>> str(x) 'foo' >>> x.__str__() 'foo' >>>
str
只是对象的string表示(记住, x
variables指的是'foo'
),所以这个函数返回string。
>>> str(5) '5'
整数5
string表示是'5'
。
>>> str('foo') 'foo'
string'foo'
string表示forms是相同的string'foo'
。
你在交互式解释器上得到的反馈也使用repr
。 当你input一个expression式(让它是expr
)时,解释器基本上是result = expr; if result is not None: print repr(result)
result = expr; if result is not None: print repr(result)
。 所以你的例子中的第二行是将stringfoo
格式化成你想要的表示( 'foo'
)。 然后解释者创build这个表示 ,留下双引号。
为什么当我将%r与双引号和单引号转义结合起来并将其打印出来时,它会按照我将其写入.py文件的方式进行打印,而不是以我想要的方式进行打印?
我不确定你在问什么 文本single ' and double " quotes
在运行repr
,包含了一种引用的转义,当然也包括了,否则它不会成为Python规则中的有效string,这正是你所要求的通过调用repr
。
另外请注意, eval(repr(x)) == x
类比并不意味着文字。 对于大多数(所有)内置types来说,这是一个近似值,并且是正确的,但主要的是,通过查看repr
输出,您可以很好地了解types和逻辑“值”。
1) repr('foo')
是string 'foo'
。 在你的Python shell中,expression式的结果也被表示为表示,所以你基本上看到了repr(repr('foo'))
。
2) eval
计算expression式的结果。 结果总是一个值 (例如数字,string或对象)。 多个variables可以引用相同的值,如下所示:
x = 'foo' y = x
x和y现在指的是相同的值。
3)我不知道你在这里的意思。 你可以发表一个例子,你想看到什么?
当你说
foo = 'bar' baz(foo)
你没有把foo
传递给baz
函数。 foo
只是一个用来表示一个值的名字,在这个例子中是'bar'
,并且这个值被传递给了baz
函数。