为什么 str(repr(p)) 和 print(repr(p)) 不一样?

Why are str(repr(p)) and print(repr(p)) not the same?

我已经阅读了这篇 thread 中的所有答案,但我被困在以下示例中:

Example:

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,当你使用 str(object)print(object) 时调用 object.__str__(self),所以我尝试了这个:

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,

In the Python shell (interactive interpreter), if you enter a variable at the >>> prompt and press RETURN, the interpreter displays the results of repr() implicitly called on that object.

repr() 正在后台调用,这意味着,在 python shell、>>> p returns repr(p) 上。

<__main__.Person object at 0x000002184030A2E0>

>>> repr(p)returnsrepr(repr(p)),即repr(<__main__.Person object at 0x000002184030A2E0>).

'<__main__.Person object at 0x000002184030A2E0>'

但是,我不确定为什么 print(repr(p))str(repr(p)) 在 python shell 上不同,他们不是调用相同的函数吗?

这里的主要混淆点是围绕 print 和 REPL 的工作方式。您可以完全从这种情况中消除 repr 并仅使用字符串文字来观察何时看到引号以及何时不看到:

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

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

的表达式时,它不会将 None 回显到控制台