在非数字Python对象上进行顺序比较的逻辑是什么?

时间:2012-10-29 21:05:42

标签: python implementation

为什么123 < list评估为True?还是list < 123False?或list < dictTrue

更一般地说,为什么<>在将数字与函数,列表或类似事物进行比较时不会引发错误?这种设计选择背后的逻辑是什么?

(请注意,这是在Python 2.7中,在Python 3中可能不是这样,我还没有尝试过)

2 个答案:

答案 0 :(得分:3)

在Python2中,docs say

  

CPython实现细节:除了以外的不同类型的对象   数字按其类型名称排序;相同类型的对象   不支持正确比较的,按其地址排序。

在Python3中,this wart is fixed

  

排序比较运算符(&lt;,&lt; =,&gt; =,&gt;)引发TypeError   当操作数没有有意义的自然顺序时的异常。   因此,表达式如1&lt; '',0&gt;无或len&lt; = len不再   有效,例如无&lt; None引发TypeError而不是返回   假。一个必然结果是不再对异构列表进行排序   有道理 - 所有元素必须相互比较。注意   这不适用于==和!=运算符:对象   不同的无与伦比的类型总是比较不相等。

答案 1 :(得分:1)

在这种情况下的比较是在type()个对象的基础上完成的:

例如:type(123)'int'type(list)'list',因此'int'<'list'的字符串比较将返回True

>>> 123<list
True
>>> type(123)<type(list)
True