在__cmp__
`我读:将Python地址作为字符串或整数进行比较?
如果没有__cmp__(), __eq__() or __ne__()
操作被定义,类实例由对象标识(“地址”)进行比较。
CPython的实现细节:不同类型的数字之外的对象由它们的类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
身份是指由id()函数(long int)返回的值吗?
那么地址比较就好像他们是整数?还是他们比较为字符串?
我试图写我自己的例子,但我无法弄清楚如何。
在__cmp__
`我读:将Python地址作为字符串或整数进行比较?
如果没有__cmp__(), __eq__() or __ne__()
操作被定义,类实例由对象标识(“地址”)进行比较。
CPython的实现细节:不同类型的数字之外的对象由它们的类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
身份是指由id()函数(long int)返回的值吗?
那么地址比较就好像他们是整数?还是他们比较为字符串?
我试图写我自己的例子,但我无法弄清楚如何。
地址/标识返回id()
,这返回一个整数值,所以是的,它们被作为整数排序。
从官方文档:
ID(对象)
返回的对象的“身份”。这是一个整数(或长整数),在整个生命周期中保证它是唯一的并且是常量。具有非重叠生命期的两个对象可能具有相同的id()值。
CPython实现细节:这是内存中对象的地址。
自己测试一下。打开交互式控制台并写下以下内容:
>>> class Test(object):
>>> pass
>>> test1 = Test()
>>> test2 = Test()
>>>
>>> print id(test1), id(test2)
35677712 35678128 # You can see the second one is bigger. Both integers!
>>>
>>> print test1 > test2
False
>>> print test1 < test2
True
无论如何,这根本没有用处。在Python 3中引发错误
我会很感激downvoting的解释。 – bgusach
不是我的失望,但是如果id是词法排序的,你会得到相同的结果,因为它们都有相同的数字位数。这并没有什么特别的证明。 – geoffspear
你的意思是我没有明确表示它们是通过地址为'int'来命令的?如果是这样,我认为很清楚'id()'返回一个整数,但我现在包含在答案中。 – bgusach
它们是按int排序的,但为什么这个实现细节对您来说很重要?无论如何,尝试排序不同类型的对象是一个糟糕的想法(在Python 3中,这只是一个错误,明智)。 – geoffspear
这只是一种好奇心,我无法找到答案。无论如何,我指的是在不重新定义\ __ lt__方法的情况下排序相同类型的对象。谢谢。 –