[英]Why the behavior is different between Python2 and Python3
在 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
進行排序,則引發異常會更有幫助。 如果內存地址排序確實是需要的,您總是可以像以前一樣實現它,但這是一個非常罕見的用例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.