为什么Python2和Python3的行为不同

时间:2020-08-28 05:02:01

标签: python python-3.x

在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__方法呢?

1 个答案:

答案 0 :(得分:5)

在Python 2中,当您缺少__lt__(或更旧的__cmp__)时,将使用默认比较规则,在这种情况下,最终将比较对象的内存地址问题(在此之前,它将数字放在其他内容之前,并根据类的字符串名称比较其他所有内容)。

但是,这几乎是没有用的。如果您尚未定义如何对类的实例进行排序,那么按内存地址任意排序(每次运行都会更改)会默默地误导99%的代码。

Python 3发生这种情况时会大声失败,因此人们不再依赖偶然地对无法分类的事物进行分类;如果有人使用未定义的顺序对您的实例中的[1, 'a', (), None]甚至只是list实例进行排序,则引发异常只会更有帮助。如果确实需要内存地址排序,则始终可以像以前一样实现它,但这是一种几乎不常见的用例。

相关问题