簡體   English   中英

為什么 Python2 和 Python3 的行為不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM