函数 str()
和 repr()
都可以将Python中的对象转换为字符串,它们的使用以及输出都非常相似,
以至于很多人认为这两者之间并没有区别,但事实是不是这样呢?
先来看对于不同 类型的输入,这两个函数的输出有何异同,如表所示。
a = 2 / 3.0
str(a), repr(a)
('0.6666666666666666', '0.6666666666666666')
a = '\r\n'
str(a), repr(a)
('\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()
方法如下。
s="' '"
str(s)
"' '"
repr(s)
'"\' \'"'
eval(repr(s))==s
True
eval(str(s))
' '
eval(str(s))==s
False
- 这两个方法分别调用内建的
_str_()
和_repr_()
方法, 一般来说在类中都应该定 义_repr_()
方法,而_str_()
方法则为可选, 当可读性比准确性更为重要的时候应该考虑定义__str()__
方法。如果类中没有定义_str_()
方法, 则默认会使用_repr_()
方法的结果来返回对象的字符串表示形式。 用户实现_repr_()
方法的时候最好保证其返回值可以用eval()
方法使对象重新还原。