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

use*_*318 23 python comparison operators python-2.x

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

是因为当我在一个数字周围放置单引号时,Python认为它是一个字符串,字符串比数字大吗?

agf*_*agf 31

是的,任何数字都将小于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);
Run Code Online (Sandbox Code Playgroud)

因此,至少在最近的CPython 2.x版本中,比较类型名称,使用空字符串而不是任何数字类型的类型名称.

  • 请参阅object.c中的[default_3way_compare](http://hg.python.org/cpython/file/0a5eb57d5876/Objects/object.c#l778). (5认同)

bil*_*aha 7

从Python v2.7.2文档

除数字外的不同类型的对象按其类型名称排序; 不支持正确比较的相同类型的对象按其地址排序.

当您订购两个字符串或两个数字类型时,排序以预期的方式完成(字符串的字典顺序,整数的数字排序).

订购字符串和整数时,会对类型名称进行排序."str"在"int","float","long","list","bool"等之后按字典顺序排列.但是元组的排序高于字符串,因为"tuple">"str":

0 > 'hi'
False
[1, 2] > 'hi'
False
(1, 2) > 'hi'
True
Run Code Online (Sandbox Code Playgroud)

另请参阅比较使用 docs.python.org中的词典排序

在Python 3.x中,行为已更改,因此尝试排序整数和字符串将引发错误:

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

  • 有一个原因被列为CPython实现细节 - 它是任意的而不是依赖的,并且可能只是真实的或仅适用于某些版本的Python.请参阅我之前的评论以获得证据 - 我正在使用那些文档据称描述的Python的确切版本,但对于某些类型则不然. (2认同)