在Python2中,它是有效的:
#!/usr/bin/python
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
a = ListNode(0)
b = ListNode(1)
print(a < b)
输出:True
但是Python3中的相同代码将引发异常:
#!/usr/bin/python3
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
a = ListNode(0)
b = ListNode(1)
print(a < b)
引发异常:
Traceback (most recent call last):
File "c.py", line 11, in <module>
print(a < b)
TypeError: '<' not supported between instances of 'ListNode' and 'ListNode'
为什么不同?
添加:
我可以将__lt__
方法添加到ListNode
中,以避免出现以下异常:ListNode.__lt__ = lambda a, b: id(a) - id(b)
。
但是为什么Python2不需要添加__lt__
方法呢?
答案 0 :(得分:5)
在Python 2中,当您缺少__lt__
(或更旧的__cmp__
)时,将使用默认比较规则,在这种情况下,最终将比较对象的内存地址问题(在此之前,它将数字放在其他内容之前,并根据类的字符串名称比较其他所有内容)。
但是,这几乎是没有用的。如果您尚未定义如何对类的实例进行排序,那么按内存地址任意排序(每次运行都会更改)会默默地误导99%的代码。
Python 3发生这种情况时会大声失败,因此人们不再依赖偶然地对无法分类的事物进行分类;如果有人使用未定义的顺序对您的实例中的[1, 'a', (), None]
甚至只是list
实例进行排序,则引发异常只会更有帮助。如果确实需要内存地址排序,则始终可以像以前一样实现它,但这是一种几乎不常见的用例。