首页 > 解决方案 > 为什么 str(repr(p)) 和 print(repr(p)) 不一样?

问题描述

我已在此线程中阅读了所有答案,但我陷入了以下示例:

示例

class Person:
     pass

p=Person()

根据这个来源,如果你打电话,repr(p)你会默认得到这个:

<__main__.Person object at 0x7fb2604f03a0>

但是,我调用repr(p)了 python shell,我得到了这个:

>>> repr(p)
'<__main__.Person object at 0x000001F1C0B1A2E0>'

据我了解,两者有很大区别:后者是python表达式,这样就可以在eval().

因为我得到了两个不同的结果,所以我试图确定原因,我认为我做到了。

>>>print(repr(p))
<__main__.Person object at 0x0000021D032392E0>

根据文档object.__str__(self)当你使用str(object)and时会调用它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>'

从这个答案

在 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>'

但是,我不确定 python shell 为什么print(repr(p))str(repr(p))不同,它们不是都调用同一个函数吗?

标签: pythonstringrepr

解决方案


这里的主要混淆点是关于printREPL 的工作方式和工作方式。您可以完全消除repr这种情况,只需使用字符串文字来观察您何时看到引号以及何时没有:

>>> "foo"
'foo'
>>> print("foo")
foo
>>> x = print("foo")
foo
>>> x
>>> x is None
True

当您看到'foo'时,它是向您显示eval您刚刚输入的字符串表达式的 (-able) 值的 REPL。当您看到foo没有引号时,这是调用的副作用print,它会打印字符串的实际内容。 print也返回None,正如x is None在将其结果分配给x. None请注意,REPL在计算返回的表达式时不会回显到控制台None


推荐阅读