函数 str() 和 repr() 都可以将Python中的对象转换为字符串,它们的使用以及输出都非常相似, 以至于很多人认为这两者之间并没有区别,但事实是不是这样呢? 先来看对于不同 类型的输入,这两个函数的输出有何异同,如表所示。
In [2]:
a = 2 / 3.0
str(a), repr(a)
Out[2]:
('0.6666666666666666', '0.6666666666666666')In [3]:
a = '\r\n'
str(a), repr(a)
Out[3]:
('\r\n', "'\\r\\n'")repr() 和 str() 的区别
repr() 和 str() 对于大多数数据类型的输出基本一致,如此混淆也就不难理解了。 但它们也存在不一致的情况。那么,这两者之间到底有什么区别呢?总结来说有以下几点:
- 两者之间的目标不同:
str()主要面向用户,其目的是可读性, 返回形式为用户友好性和可读件都较强的字符串类型;而repr()面向的是Python解释器, 或者说开发人员,其目的是准确性,其返回值表示Python解释器内部的含义,常作为编程人员debug用途。 - 在解释器中直接输入
a时默认调用repr()函数,而print(a)则调用str()函数。 repr()的返回值一般可以用eval()函数来还原对象,通常来说有如下等式:
obj == eval(repr(obj))还需要提醒的是,这个等式不是所有情况下都成立,如用户重新实现的 repr() 方法如下。
In [4]:
s="' '"
str(s)
Out[4]:
"' '"
In [5]:
repr(s)
Out[5]:
'"\' \'"'
In [6]:
eval(repr(s))==s
Out[6]:
True
In [7]:
eval(str(s))
Out[7]:
' '
In [8]:
eval(str(s))==s
Out[8]:
False
- 这两个方法分别调用内建的
_str_()和_repr_()方法, 一般来说在类中都应该定 义_repr_()方法,而_str_()方法则为可选, 当可读性比准确性更为重要的时候应该考虑定义__str()__方法。如果类中没有定义_str_()方法, 则默认会使用_repr_()方法的结果来返回对象的字符串表示形式。 用户实现_repr_()方法的时候最好保证其返回值可以用eval()方法使对象重新还原。