【问题标题】:Why are str(repr(p)) and print(repr(p)) not the same?为什么 str(repr(p)) 和 print(repr(p)) 不一样?
【发布时间】:2021-12-21 14:04:07
【问题描述】:

我已在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>

根据documentationobject.__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 上,&gt;&gt;&gt; p 返回repr(p)

<__main__.Person object at 0x000002184030A2E0>

&gt;&gt;&gt; repr(p) 返回repr(repr(p)),即repr(&lt;__main__.Person object at 0x000002184030A2E0&gt;)

'<__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
  • 参数无关;问题是strprint 做了两件完全不同的事情。
  • 是的,但它也会写入标准输出,str 不会。两者不可互换。

标签: python string repr


【解决方案1】:

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

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

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

【讨论】:

  • "请注意,当 REPL 评估返回 None 的表达式时,它不会将 None 回显到控制台。"它什么也不返回,对吧?
  • 它完全没有回应,正确的。请注意,当我只输入x(即None)时,什么都没有,甚至没有空行。
  • 为什么repr(None) 不返回任何东西?我在文档中找不到有关它的信息。
  • repr(None) 返回字符串 'None'。您可能仍然对 returning 值和 printing 值之间的区别感到困惑(因为 REPL 会自动打印任何非 None 返回值)。跨度>
  • 现在很清楚了,谢谢。我不知道 REPL 是这样做的,我读过的书从来没有提到过这样的事情。
猜你喜欢
  • 2021-05-19
  • 2018-01-04
  • 2016-11-19
  • 2011-10-31
  • 2015-04-14
  • 1970-01-01
  • 2020-08-25
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多