2016-05-23 37 views
2

Python中內置的reversed(seq)表示seq必須具有__reversed__()方法或支持序列協議。列表和元組都明顯支持順序協議,但是列表有自己的__reversed__()方法。爲什麼列表有一個__reverse __()特殊方法,但元組不在Python中?

>>> hasattr(list, '__reversed__') 
True 
>>> hasattr(tuple, '__reversed__') 
False 

那麼就必須在__reverse__()比對序列協議將爲扭轉名單快了一些優化。於是我帶着一看source code where __reversed__() is implemented爲listobject.c,並與我的可憐有限Ç的知識,我不明白爲什麼一個元組(tupleobject.c)不會有類似的內部倒車方法,作爲一個元組,在我看來豆陣列與一些優化(PyTuple_MAXSAVESIZE)分配和內存,列表是一個更熟悉的數組。

什麼是我錯過的C魔法,使實現__reversed__()方法優化列表類型,但標準迭代器協議更好的元組?

回答

4

元組很少以相反的順序迭代。

這是因爲元組是異質,名單是同質;而列表有秩序,元組意味着有結構。作爲結果,元組是爲了比較,而列表可以是(非常)大。見What's the difference between lists and tuples?

因此,根本就沒有必要創建一個元組一個反向迭代;這將是一個過早的優化,造成很少收益的維護成本。

+0

啊,所以我把它看作一個優化_not_有一個'__reversed __()'方法元組,但它實際上只是一個不被價值實現的事情,甚至沒有考慮,由於某些原因,立刻想到優化。謝謝! –

相關問題