在python中,執行如下的**
nan = float("nan"
)print nan ==nan
print [nan] == [nan]
其輸出結果分別為false 和 true,於是決定去檢視相關的**查詢原因。
首先,float中nan在ieee標準中有約定,與任何值都不相等,所以主要需要確認的就是列表的比較規則。
static pyobject *list_richcompare(pyobject *v, pyobject *w, int op)
list的比較使用的是list_richcompare函式,接收3個引數,待比較的兩個引用以及操作符
if (!pylist_check(v) || !pylist_check(w))vl = (pylistobject *)v;
wl = (pylistobject *)w;
首先檢查輸入的待比較的元素是否是列表,然後轉換指標的型別為列表
if (py_size(vl) != py_size(wl) && (op == py_eq || op ==py_ne))
對於,==和!=兩個操作符,如果兩個列表的大小不想等,則可以直接返回false或者true的結果,無須再進行其他比較。
for (i = 0; i < py_size(vl) && i < py_size(wl); i++)
從頭開始比較列表的中元素,直到有乙個列表遍歷完或者有不相等的情況則中止,搜尋出第乙個不相等的成員的索引值。
其中對於每個元素的比較,呼叫的是pyobject_richcomparebool方法
if (i >= py_size(vl) || i >=py_size(wl))if(cmp)
res =py_true;
else
res =py_false;
py_incref(res);
return
res;
}
如果至少有乙個列表遍歷結束,則所有比較過的元素都一致。
則哪個列表的尺寸長,那麼該列表就大。如果兩個列表的尺寸相同,則這兩個列表就相等。只需針對不同的op,返回不同的結果即可。
if (op ==py_eq)if (op ==py_ne)
如果在兩列表的尺寸範圍內,找到了不相等的成員,就說明這兩個列表不相等,為==和!=提供捷徑。
return pyobject_richcompare(vl->ob_item[i], wl->ob_item[i], op);
當op不為py_eq或py_ne時,就將第乙個不相等的成員的比較結果作為,這兩個列表的比較結果。
對於pyobject_richcomparebool
/*return -1 if error; 1 if v op w; 0 if not (v op w).
*/int
pyobject_richcomparebool(pyobject *v, pyobject *w, int
op) res =pyobject_richcompare(v, w, op);
if (res ==null)
return -1
;
if(pybool_check(res))
ok = (res ==py_true);
else
ok =pyobject_istrue(res);
py_decref(res);
return
ok;}
在比較之前,會首先看兩個比較元素的引用位址,如果相同則視為相等。
所以nan在列表中比較時由於引用位址一樣,也會被視為相等。
list中的比較
一說到list的的確不知道寫些什麼。我覺得別人總結的比我寫的還要好很多。list 元素是有序的 怎麼存的就怎麼取出來,順序不會亂 元素可以重複 角標1上有個3,角標2上也可以有個3 因為該集合體系有索引,arraylist 底層的資料結構使用的是陣列結構 陣列長度是可變的百分之五十延長 特點是查詢很...
java中List集合的比較
list集合 list是乙個介面,它的父類介面時collection list的實現類 arraylist 陣列實現 linkedlist 鍊錶實現 vector 也是陣列實現 arraylist 和 linkedlist 1 實現不同,乙個是陣列實現,乙個是鍊錶實現 2 效率不同,arraylis...
python中改變list中list值的問題
l s 0,0,0 for i in range 3 l 1 1 1 print l 如上 定義乙個空list,新增元素也為list型別。本意是想改變list l中乙個值,使其結果為 0,0,0 0,1,0 0,0,0 但執行的結構下圖所示,將list l中的所有元素都改變了。為找到原因,檢視pyt...