首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么str(repr(p))和print(repr(p))不一样?

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

Stack Overflow用户
提问于 2021-11-08 18:45:00
回答 1查看 82关注 0票数 0

我在这个线程中读到了所有的答案,但是我被困在了下面的例子中:

示例

代码语言:javascript
复制
class Person:
     pass

p=Person()

根据这个消息来源,如果您调用repr(p),您将得到默认的如下结果:

代码语言:javascript
复制
<__main__.Person object at 0x7fb2604f03a0>

但是,我在python上调用了repr(p),并得到了以下结果:

代码语言:javascript
复制
>>> repr(p)
'<__main__.Person object at 0x000001F1C0B1A2E0>'

就我的理解而言,这两者之间有一个巨大的区别:后者是python表达式,这样,它可以在eval()中使用。

因为我得到了两个不同的结果,我试图找出原因,而我认为我做到了。

代码语言:javascript
复制
>>>print(repr(p))
<__main__.Person object at 0x0000021D032392E0>

根据文档,当您使用str(object)print(object)时,会调用object.__str__(self),因此我尝试了以下操作:

代码语言:javascript
复制
x = print(repr(p))
y = str(repr(p))
>>> x == y
False

比较:

代码语言:javascript
复制
>>> print(repr(p))
<__main__.Person object at 0x0000021D032392E0>
>>> str(repr(p))
'<__main__.Person object at 0x0000021D032392E0>'

从这个回答

在Python (交互式解释器)中,如果在>>>提示符下输入一个变量并按返回键,解释器将显示对该对象隐式调用的repr()结果。

repr()在幕后被调用,这意味着在python上,>>> p返回repr(p)

代码语言:javascript
复制
<__main__.Person object at 0x000002184030A2E0>

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

代码语言:javascript
复制
'<__main__.Person object at 0x000002184030A2E0>'

但是,我不知道为什么print(repr(p))str(repr(p))在python上有差异,它们不是都调用了相同的函数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-08 18:51:47

这里主要的混淆点是print和REPL是如何工作的。您可以从情况中完全消除repr,只需使用字符串文字来观察当您看到引号时和未看到引号时:

代码语言:javascript
复制
>>> "foo"
'foo'
>>> print("foo")
foo
>>> x = print("foo")
foo
>>> x
>>> x is None
True

当您看到'foo'时,它将显示您刚刚输入的字符串表达式的(eval-able)值。当您看到没有引号的foo时,这是调用print的副作用,它会打印字符串的实际内容。print还返回None,在将其结果赋值给x之后,通过计算x is None来说明这一点。注意,REPL在计算返回None的表达式时不会回显None到控制台。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69888439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档