2014-02-06 35 views
0

__cmp__`我读:将Python地址作为字符串或整数进行比较?

如果没有__cmp__(), __eq__() or __ne__()操作被定义,类实例由对象标识(“地址”)进行比较。

5.3 Comparisons

CPython的实现细节:不同类型的数字之外的对象由它们的类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

身份是指由id()函数(long int)返回的值吗?

那么地址比较就好像他们是整数?还是他们比较为字符串?

我试图写我自己的例子,但我无法弄清楚如何。

+1

它们是按int排序的,但为什么这个实现细节对您来说很重要?无论如何,尝试排序不同类型的对象是一个糟糕的想法(在Python 3中,这只是一个错误,明智)。 – geoffspear

+0

这只是一种好奇心,我无法找到答案。无论如何,我指的是在不重新定义\ __ lt__方法的情况下排序相同类型的对象。谢谢。 –

回答

2

地址/标识返回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中引发错误

+0

我会很感激downvoting的解释。 – bgusach

+2

不是我的失望,但是如果id是词法排序的,你会得到相同的结果,因为它们都有相同的数字位数。这并没有什么特别的证明。 – geoffspear

+0

你的意思是我没有明确表示它们是通过地址为'int'来命令的?如果是这样,我认为很清楚'id()'返回一个整数,但我现在包含在答案中。 – bgusach

相关问题