在嘗試比較字典時,python 會引發 TypeError:
{"a" : "b"} < {"a" : "b"} # TypeError
當嘗試比較元組時,python 會按元素進行:
(1, 2) > (1, 1) # True
因此,我預計如果字典前面的元素相等,則比較包含字典的元組會導致 TypeError,因為它將被迫比較字典,這會引發 TypeError。不是這種情況:
(3, {"a" : "b"}) < (3, {"a" : "b"}) # False, no TypeError
我已經通讀了我能找到的有關 Python 排序的檔案,但沒有看到任何記錄此行為的內容。我可以依靠這種行為在未來版本中保持不變嗎?
uj5u.com熱心網友回復:
這在檔案中進行了解釋:
內置集合之間的字典比較作業如下:
兩個集合要比較相等,它們必須是相同的型別,具有相同的長度,并且每對對應的元素必須比較相等(例如,[1,2] == (1,2) 為假,因為型別不一樣)。
支持順序比較的集合的順序與其第一個不相等的元素相同(例如,[1,2,x] <= [1,2,y] 與 x <= y 具有相同的值)。如果對應的元素不存在,則較短的集合首先排序(例如,[1,2] < [1,2,3] 為真)。
所以元組比較要做的第一件事就是找出不相等的元素,因為元組中沒有不相等的元素,結果是False,并且不需要呼叫 的代碼<。
通過查看元組比較的實作進一步證實了這一點:
for (i = 0; i < vlen && i < wlen; i ) {
int k = PyObject_RichCompareBool(vt->ob_item[i],
wt->ob_item[i], Py_EQ);
if (k < 0)
return NULL;
if (!k)
break;
}
if (i >= vlen || i >= wlen) {
/* No more items to compare -- compare sizes */
Py_RETURN_RICHCOMPARE(vlen, wlen, op);
}
上面代碼中的 for 回圈試圖找到第一個不相等的元素,如果沒有找到,則將比較委托給元組的大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312295.html
上一篇:年輕人的第一個桌面應用
