【发布时间】:2021-12-21 14:04:07
【问题描述】:
我已在thread 中阅读了所有答案,但我陷入了以下示例:
class Person:
pass
p=Person()
根据这个来源,如果你打电话给repr(p),你会默认得到这个:
<__main__.Person object at 0x7fb2604f03a0>
但是,我在 python shell 上调用了repr(p),得到了这个:
>>> repr(p)
'<__main__.Person object at 0x000001F1C0B1A2E0>'
据我了解,两者有很大区别:后者是python表达式,这样可以在eval()中使用。
因为我得到了两个不同的结果,所以我试图确定原因,我想我做到了。
>>>print(repr(p))
<__main__.Person object at 0x0000021D032392E0>
根据documentation,object.__str__(self)在你使用str(object)和print(object)时被调用,所以我试了一下:
x = print(repr(p))
y = str(repr(p))
>>> x == y
False
比较:
>>> print(repr(p))
<__main__.Person object at 0x0000021D032392E0>
>>> str(repr(p))
'<__main__.Person object at 0x0000021D032392E0>'
来自这个answer,
在 Python shell(交互式解释器)中,如果在 >>> 提示符下输入变量并按 RETURN,解释器会显示对该对象隐式调用的 repr() 的结果。
repr() 在后台被调用,这意味着在 python shell 上,>>> p 返回repr(p)。
<__main__.Person object at 0x000002184030A2E0>
>>> repr(p) 返回repr(repr(p)),即repr(<__main__.Person object at 0x000002184030A2E0>)。
'<__main__.Person object at 0x000002184030A2E0>'
但是,我不确定为什么 print(repr(p)) 和 str(repr(p)) 在 python shell 上有所不同,它们不是都调用相同的函数吗?
【问题讨论】:
-
print()不会在字符串周围加上引号。 REPL 可以。 -
x = print(whatever)将x设置为None,因为print在将whatever打印到控制台后返回None。 -
x = print(repr(p))是None -
参数无关;问题是
str和print做了两件完全不同的事情。 -
是的,但它也会写入标准输出,
str不会。两者不可互换。