我在这个线程中读到了所有的答案,但是我被困在了下面的例子中:
class Person:
pass
p=Person()根据这个消息来源,如果您调用repr(p),您将得到默认的如下结果:
<__main__.Person object at 0x7fb2604f03a0>但是,我在python上调用了repr(p),并得到了以下结果:
>>> repr(p)
'<__main__.Person object at 0x000001F1C0B1A2E0>'就我的理解而言,这两者之间有一个巨大的区别:后者是python表达式,这样,它可以在eval()中使用。
因为我得到了两个不同的结果,我试图找出原因,而我认为我做到了。
>>>print(repr(p))
<__main__.Person object at 0x0000021D032392E0>根据文档,当您使用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>'从这个回答,
在Python (交互式解释器)中,如果在>>>提示符下输入一个变量并按返回键,解释器将显示对该对象隐式调用的repr()结果。
repr()在幕后被调用,这意味着在python上,>>> p返回repr(p)。
<__main__.Person object at 0x000002184030A2E0>>>> repr(p)返回repr(repr(p)),即repr(<__main__.Person object at 0x000002184030A2E0>)。
'<__main__.Person object at 0x000002184030A2E0>'但是,我不知道为什么print(repr(p))和str(repr(p))在python上有差异,它们不是都调用了相同的函数吗?
发布于 2021-11-08 18:51:47
这里主要的混淆点是print和REPL是如何工作的。您可以从情况中完全消除repr,只需使用字符串文字来观察当您看到引号时和未看到引号时:
>>> "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到控制台。
https://stackoverflow.com/questions/69888439
复制相似问题