__ repr__方法和列表上的repr()返回不同的对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__ repr__方法和列表上的repr()返回不同的对象相关的知识,希望对你有一定的参考价值。

说我们有一个列表my_num=[1,2,3,4,5]。在该列表上应用repr()将以字符串形式表示此对象的表示形式,例如a=repr(my_num)。我以为调用my_num.__repr__()会产生相同的对象。

但是:

>>> my_num=[1,2,3,4,5]
>>> a=repr(my_num)
>>> a is my_num.__repr__()
False

为什么会这样?

答案
>>> my_num = [1, 2, 3, 4, 5]
>>> id(repr(my_num))
140357224404912
>>> id(my_num.__repr__())
140357224404976
>>> repr(my_num) == my_num.__repr__()
True

如您所见,id是不同的(即,这些是不同的对象),但是它们是相等的。

另一答案

非常简单,每个调用都返回my_num的字符串图像。 Python将折叠小整数,但不会折叠任何复杂的字符串。每个调用都返回一个separate字符串对象,因此它们具有不同的id值。

is比较ID; ==比较值。

>>> my_num=[1,2,3,4,5]
>>> repr(my_num)
'[1, 2, 3, 4, 5]'
>>> a = repr(my_num)
>>> id(a)
139786829689392
>>> a
'[1, 2, 3, 4, 5]'
>>> b = my_num.__repr__()
>>> b
'[1, 2, 3, 4, 5]'
>>> id(b)
139786829689264
>>> a is b
False
>>> a == b
True
另一答案

equality and identity之间有区别。使用repr(obj)obj.__repr__()是相同的,但是repr函数创建了一个新的字符串对象,因此创建的两个对象并不相同。

您甚至可以看到:

>>> my_num=[1,2,3,4,5]
>>> my_num.__repr__() is my_num.__repr__()
False

检查这些以获取更多信息:

Python: Why does ("hello" is "hello") evaluate as True?

Why does comparing strings using either '==' or 'is' sometimes produce a different result?

以上是关于__ repr__方法和列表上的repr()返回不同的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 __repr__ 从中创建新对象?

python类中方法__str__()和__repr__()简单粗暴总结

编写repr方法

Python中的__str__()方法和__repr__()方法

__str__和__repr__的区别

python_魔法方法:__str__()和__repr__()