comparator如何处理python中不可比较的对象?

comparator如何处理python中不可比较的对象?,python,Python,我定义了一个列表,如下所示: list = [1,3,2,[4,5,6]] def reverseCom(x,y): if(x>y): return -1 elif(x<y): return 1 else: return 0 然后定义了比较器方法,如下所示: list = [1,3,2,[4,5,6]] def reverseCom(x,y): if(x>y): return -1

我定义了一个列表,如下所示:

list = [1,3,2,[4,5,6]]
def reverseCom(x,y):
   if(x>y):
        return -1
   elif(x<y):
        return 1
   else:
        return 0
然后定义了比较器方法,如下所示:

list = [1,3,2,[4,5,6]]
def reverseCom(x,y):
   if(x>y):
        return -1
   elif(x<y):
        return 1
   else:
        return 0
结果:[[4,5,6],3,2,1]

虽然元素[4,5,6]与列表中的其他元素不可比较。怎么会不出错呢


您是否可以帮助我了解排序如何与python中的用户定义比较器一起工作?

您的比较器实际上可以工作,即不会抛出任何错误:

In [9]: reverseCom([4,5,6],1)
Out[9]: -1

In [10]: reverseCom([4,5,6],2)
Out[10]: -1

In [11]: reverseCom([4,5,6],3)
Out[11]: -1
它工作的原因是,
list
实例总是大于
int
实例:

In [12]: [1,2,3] > 5
Out[12]: True

In [13]: ['hello'] > 5
Out[13]: True

In [14]: [] > -1
Out[14]: True

这是Python 2的一个怪癖。在Python 2中,数值和非数值是可比较的,数值总是被认为小于容器对象的值:

>>> 1 < [1]
True
>>> 1 < [2]
True
>>> 1558 < [1]
True
>>> 1 < {}
True
现在,在比较两个不同、非数字、非容器类型的对象时,似乎要考虑的是它们的地址:

>>> class A: pass
...
>>> class B: pass
...
>>> a = A()
>>> a
<__main__.A instance at 0x0000000002265348>
>>> b = B()
>>> b
<__main__.B instance at 0x0000000002265048>
>>> a < b
False
>>> b < a
True
>A类:合格
...
>>>乙级:及格
...
>>>a=a()
>>>a
>>>b=b()
>>>b
>>>a>>b
如果你问我的话,那真是太棒了

当然,如果您想覆盖类定义中的
\ult\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

可以提供关于这些方法如何操作的进一步文档


底线:尽可能避免不同类型之间的比较。结果真的是不可预测的,不直观的,也没有那么好的记录。此外,尽可能使用Python 3。

不会出现错误,因为对象是可比较的。也就是说,
list
实例可以与
int
实例进行比较。试试
[4,5,6]>3
。就我记忆所及,Any
list
总是大于Any
int
。这就是比较方法在
列表中定义的方式
@Eli谢谢你的回复,我对python非常陌生。你能帮我理解实例之间的比较是如何工作的吗A类:通过
a=a()打印a>10-->假
。打印一个>10-->true并打印“>100000000000000000-->true
@Oori我更新了我的答案,提供了更多关于那些疯狂的Python 2比较是如何工作的示例和信息。请看一下,它可能会解决你的一些问题。
>>> class A: pass
...
>>> a = A()
>>> 1 > a
True
>>> 2.7 > a
True
>>> class A: pass
...
>>> class B: pass
...
>>> a = A()
>>> a
<__main__.A instance at 0x0000000002265348>
>>> b = B()
>>> b
<__main__.B instance at 0x0000000002265048>
>>> a < b
False
>>> b < a
True