为什么 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
回显到控制台
我已经阅读了这篇 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
回显到控制台