在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__
方法呢?
在Python 2中,当您缺少__lt__
(或不推荐使用旧版本__cmp__
)时,会使用默认的比较规则,在这种情况下,最终会比较出相关对象的内存地址(在此之前,它会将数字放在其他东西之前,并根据类的字符串名称比较其他所有内容)。
但这几乎是没有用的。如果您尚未定义如何排序一个类的实例,那么按内存地址任意排序(每次运行都会改变)会静默地误导99%的代码。
当发生这种情况时,Python 3会大声失败,因此人们不必依赖偶然地对无法分类的事物进行分类;如果有人以未定义的顺序对您的实例进行排序[1, 'a', (), None]
甚至只是其中的一个list
实例,则引发异常只会更有帮助。如果确实需要内存地址排序,则始终可以像以前一样实现它,但这是一种几乎不常见的用例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句