假设我们有一个列表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为什么会发生这种情况?
发布于 2020-03-21 01:59:45
非常简单,每次调用都会返回一个my_num的字符串图像。Python可以折叠小整数,但不会折叠任何复杂的字符串。每次调用都返回一个单独的string对象,因此它们具有不同的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发布于 2020-03-21 01:58:36
>>> 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是不同的(即它们是不同的对象),但它们是相等的。
发布于 2020-03-21 02:01:22
equality and identity是有区别的。使用repr(obj)和obj.__repr__()是相同的,但是repr函数会创建一个新的string对象,因此创建的两个对象是不同的。
你甚至可以看到:
>>> 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?
https://stackoverflow.com/questions/60779208
复制相似问题