gpt4 book ai didi

python - 比较器如何用于 python 中不可比较的对象?

转载 作者:太空狗 更新时间:2023-10-29 21:31:05 24 4
gpt4 key购买 nike

我定义了一个列表如下:

list = [1,3,2,[4,5,6]]

然后定义了一个比较器方法如下:

def reverseCom(x,y):
if(x>y):
return -1
elif(x<y):
return 1
else:
return 0

现在我已经使用 reverseCom 对列表进行了排序:

list.sort(reverseCom)
print list

Result : [[4, 5, 6], 3, 2, 1]

虽然元素 [4, 5, 6] 不能与列表中的其他元素进行比较。它怎么不抛出任何错误?

你能帮我理解 sort 如何与 python 中的用户定义比较器一起工作吗?

最佳答案

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

>>> 1 < [1]
True
>>> 1 < [2]
True
>>> 1558 < [1]
True
>>> 1 < {}
True

另一方面,当比较两个不同类型的容器值时,会考虑它们类型的名称:

>>> () < []
False
>>> 'tuple' < 'list'
False

>>> {} < []
True
>>> 'dict' < 'list'
True

但是,此功能已在 Python 3 中删除,这使得数值和非数值不再具有可比性:

>>> 1 < [1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < list()

编辑:下一个解释完全基于实验,我找不到可靠的文档来支持它。如果有人找到它,我很乐意通读。

在比较用户定义对象/非容器对象时,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

如果你问我,那真的是香蕉。

当然,如果您想覆盖 __lt__(),所有这些都可以改变。和 __gt__()类定义中的方法,这些方法确定 < 的标准行为和 >运营商。

有关这些方法如何操作的更多文档可以是 found here .

底线:尽可能避免比较不同类型。结果真的是不可预测的,不直观的,而且没有得到很好的记录。此外,尽可能使用 Python 3。

关于python - 比较器如何用于 python 中不可比较的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34474538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com