了解Python中的repr()函数

repr() :可评估的对象的string表示forms(可以是“eval()”it,表示它是一个string表示forms,用于计算Python对象)

换一种说法:

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

问题:

  1. 当我做repr(x)时,为什么我会得到双引号? (当我做str(x)时,我不会得到它们)
  2. 为什么当我做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一样。 但没有可用的foovariables,并引发exception。

 >>> str(x) 'foo' >>> x.__str__() 'foo' >>> 

str只是对象的string表示(记住, xvariables指的是'foo' ),所以这个函数返回string。

 >>> str(5) '5' 

整数5string表示是'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函数。