__ 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()返回不同的对象的主要内容,如果未能解决你的问题,请参考以下文章
python类中方法__str__()和__repr__()简单粗暴总结