python - 为什么 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))
不同,它们不是都调用同一个函数吗?
解决方案
这里的主要混淆点是关于print
REPL 的工作方式和工作方式。您可以完全消除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
。
推荐阅读
- c# - 其他 Datagrid 中的 WPF Datagrid
- r - 创建一个闪亮的应用程序,当输入 URL 时,可以下载一个 csv 文件
- java - 删除 VS Code PROBLEMS 窗口中的 Java 警告
- angular - 如何从 Angular 中的 Observable 中提取数据
- python - 我不知道如何混合我的 csv 代码。我会在下面告诉你我的意思
- c# - 如何根据发布配置更改硬编码变量?
- autohotkey - 如何设置由鼠标位置触发的按键?
- javascript - 在本地将 Firestore 子集合导出为 CSV 或 JSON
- java - 页面对象模型类中的 NullPointerException
- python - Pandas 数据框将日期从 int64 更改为 datetime 中的日期