簡體   English   中英

Python:為什么不支持列表和元組之間的比較?

[英]Python: Why is comparison between lists and tuples not supported?

將元組與類似...的列表進行比較時

>>> [1,2,3] == (1,2,3)
False
>>> [1,2,3].__eq__((1,2,3))
NotImplemented
>>> (1,2,3).__eq__([1,2,3])
NotImplemented

... Python並不像(1,2,3) == (1,2,3)那樣對它們進行深度比較。

那是什么原因呢? 是因為可變列表可以隨時更改(線程安全問題)還是什么?

(我知道這是在CPython中實現的,所以請不要回答where ,而是為什么要實現它。)

您可以隨時“投射”它

>>> tuple([1, 2]) == (1, 2)
True

請記住,與Javascript不同,Python 是強 類型的 ,我們中的某些人(大多數?)更喜歡這種方式。

沒有技術原因不能將列表與元組進行比較。 這完全是由語義驅動的設計決策。 為了證明它與線程安全無關,可以將列表與其他列表進行比較:

>>> l1 = [1, 2, 3]
>>> l2 = [1, 2, 3]
>>> l1 == l2
True
>>> id(l1) == id(l2)
False

允許用戶直接比較列表和元組似乎是合理的,但是隨后您會遇到其他問題:是否應該允許用戶比較列表和隊列? 提供迭代器的任何兩個對象呢? 接下來呢?

>>> s = set([('x', 1), ('y', 2)])
>>> d = dict(s)
>>> s == d  # This doesn't work
False

它很快就會變得復雜。 語言設計師意識到了這個問題,並通過簡單地防止不同類型的集合直接相互比較1來避免了這一問題。

請注意,簡單的解決方案(從元組創建新列表並進行比較)很簡單但效率低下。 如果您要處理大量項目,則最好使用以下方法:

def compare_sequences(iter1, iter2):
    iter1, iter2 = iter(iter1), iter(iter2)
    for i1 in iter1:
        try:
            i2 = next(iter2)
        except StopIteration:
            return False

        if i1 != i2:
            return False

    try:
        i2 = next(iter2)
    except StopIteration:
        return True

    return False

這樣做的好處是可以處理任何兩個序列,但是復雜性卻很明顯。


1我注意到集合和凍結集合存在例外。 毫無疑問,還有一些我不知道的其他人。 語言設計師是純粹主義者,除非在實用上值得付出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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