>>> from env_helper import info; info()
页面更新时间: 2023-12-27 09:28:02
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.16. 深入理解 str()repr() 的区别

函数 str()repr() 都可以将Python中的对象转换为字符串,它们的使用以及输出都非常相似, 以至于很多人认为这两者之间并没有区别,但事实是不是这样呢? 先来看对于不同 类型的输人,这两个函数的输出有何异同,如表所示。

image1 image2

repr()str() 对于大多数数据类型的输出基本一致,W此混淆也就不难 理解了。 但它们也存在不一致的情况。那么,这两者之间到底有什么区别呢?总结来说有以 下几点:

  1. 两者之间的目标不同: str() 主要面向用户,其目的是可读性,返回形式为用户友好 性和可读件都较强的字符串类型;而 repr() 面向的是Python解释器,或者说开发人员,其目 的是准确性,其返回值表示Python解释器内部的含义,常作为编程人员debug用途。

  2. 在解释器中直接输人 a 时默认调用 repr() 函数,而 print(a) 则调用 str() 函数。

  3. 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

4)这两个方法分别调用内建的 _str_()_repr_() 方法,一般来说在类中都应该定 义 _repr_() 方法,而 _str_() 方法则为可选,当可读性比准确性更为重要的时候应该考虑定义 __str()__ 方法。如果类中没有定义 _str_() 方法,则默认会使用 _repr_() 方法的结果来返回对象的字符串表示形式。用户实现 _repr_() 方法的时候最好保证其返回值可以用 eval() 方法使对象重新还原。