Python 中 str() 和 repr() 有什么区别?
str() 面向用户生成可读字符串,repr() 面向开发者生成可重现对象的精确表示。print 用 str,交互式终端回显用 repr。本文用示例说明区别与 __str__/__repr__ 自定义方法。
一句话:str() 给人看(可读性优先),repr() 给机器/开发者看(精确性优先,理想情况下能 eval 还原对象)。例如字符串:str 是 hello,repr 是 'hello'(带引号)。
直观对比
s = 'hello\n'
print(str(s)) # hello(换行真的生效)
print(repr(s)) # 'hello\n'(转义可见,带引号)
import datetime
d = datetime.datetime(2024, 1, 15)
str(d) # '2024-01-15 00:00:00'
repr(d) # 'datetime.datetime(2024, 1, 15, 0, 0)'
自定义类中的两个魔术方法
class Point:
def __init__(self, x, y): self.x, self.y = x, y
def __repr__(self): return f'Point({self.x}, {self.y})' # 开发者视角
def __str__(self): return f'({self.x}, {self.y})' # 用户视角
至少要写 __repr__——没定义 __str__ 时 str() 会回退用 __repr__;反之不行。
常见问题(FAQ)
Q:日志里该用哪个? 记录对象状态用 repr(或 f'{obj!r}'),信息更全,排障友好。
Q:列表打印元素时用的哪个? 容器内元素一律用 repr——所以列表里的字符串显示带引号。