簡體   English   中英

為什么4 <'3'在Python 2中返回True?

[英]Why does 4 < '3' return True in Python 2?

為什么4 < '3'在Python 2中返回True

是因為當我在數字周圍加上單引號時,Python會將其視為字符串並且字符串大於數字嗎?

是的,任何數字都將小於Python 2中的任何字符串(包括空字符串)。

在Python 3中,您無法進行任意比較。 您將收到TypeError


eryksun的評論鏈接

if (PyNumber_Check(v))
    vname = "";
else
    vname = v->ob_type->tp_name;
if (PyNumber_Check(w))
    wname = "";
else
    wname = w->ob_type->tp_name;
c = strcmp(vname, wname);

因此,至少在最新版本的CPython 2.x中,將比較類型名稱,並使用空字符串代替任何數字類型的類型名稱。

來自Python v2.7.2文檔

除數字外,其他類型的對象均按其類型名稱排序; 不支持正確比較的相同類型的對象按其地址排序。

當您對兩個字符串或兩個數字類型進行排序時,將以預期的方式進行排序(字符串的字典順序,整數的數字順序)。

當您訂購字符串和整數時,將對類型名稱進行排序。 在字典上,“ str”在“ int”,“ float”,“ long”,“ list”,“ bool”等之后。但是,由於“ tuple”>“ str”,所以元組的順序將比字符串高。

0 > 'hi'
False
[1, 2] > 'hi'
False
(1, 2) > 'hi'
True

還可以看到比較使用 docs.python.org中的字典順序

在Python 3.x中,行為已更改,因此嘗試對整數和字符串進行排序將引發錯誤:

>>> '10' > 5
Traceback (most recent call last):
File "", line 1, in 
'10' > 5
TypeError: unorderable types: str() > int()

cpython 2中的默認比較操作基於相關對象的內存地址。 在python 2.7中的type_richcompare()中:

/* Compare addresses */
vv = (Py_uintptr_t)v;
ww = (Py_uintptr_t)w;
switch (op) {
case Py_LT: c = vv <  ww; break;
case Py_LE: c = vv <= ww; break;
case Py_EQ: c = vv == ww; break;
case Py_NE: c = vv != ww; break;
case Py_GT: c = vv >  ww; break;
case Py_GE: c = vv >= ww; break;
default:
    result = Py_NotImplemented;
    goto out;
}
result = c ? Py_True : Py_False;

這對於平等和不平等確實非常有效,但是對於排序操作可能是違反直覺的,因此對於Python 3進行了更改。實際上,當給-3標志時,2.7將針對此類用法發出警告。

要查看給定對象的內存地址,可以在其上使用id()內置函數。 僅為每個對象返回唯一的定義,但是cpython使用對象的內存地址作為便捷的快捷方式。

至少在某些python版本中,小整數恰好比短字符串具有較小的內存地址,這可能是由於cpython用於增強性能的緩存所致。

暫無
暫無

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

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