Python中是否存在无法比较的对象?
我特别询问技术上不可能进行比较操作的对象。我正在编写一个列表实用程序函数。我可以假设每个列表都是可排序的吗?
答案 0 :(得分:6)
在Python 2中,在所有对象中定义了总排序。即使是不同类型的对象,也不仅可以与==
和!=
进行比较,还可以与<
和>
进行比较。不同类型的对象在某种程度上被任意比较,因为它们的类型的身份“较少”,因此1 < "2"
将返回任意但一致的结果。这有一个有用的属性,允许对异类对象进行排序。
用户定义的对象仍然可以在比较方法中引发异常,例如__lt__
,__gt__
等。例如:
>>> np.array([1, 2, 3]) < np.array([1, 2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3) (2)
Python 3更严格:它不允许对无法进行有意义比较的内置对象进行总排序,因此1 < "2"
会引发TypeError
。当然,仍然允许与==
和!=
进行比较。
答案 1 :(得分:1)
是的,他们这样做。
class Foo(object):
def __cmp__(self, o):
raise TypeError("I'm incomperable!")
foo1 = Foo()
foo2 = Foo()
print(foo1 < foo2)