考虑Python中的以下问题:
>>> () < []
此声明会产生False
和
>>> () > []
产生真实。据我所知,[]
等于False
,但什么是空元组?
如果我们输入
>>> 1233 < (1,2)
我们获得True
作为返回值。但为什么 ?
由于
答案 0 :(得分:3)
来自docs:
运算符&lt;,&gt;,==,&gt; =,&lt; =和!=比较两个值 对象。对象不必具有相同的类型。如果两者都是数字, 它们被转换为普通类型。否则,对象不同 类型总是比较不相等,并且一致地排序但是 随意。您可以控制对象的比较行为 非内置类型通过定义
__cmp__
方法或丰富的比较 像__gt__
这样的方法,见3.4节。(这种不寻常的比较定义用于简化 操作的定义,如排序和运算符中的in和not。 将来,不同类型对象的比较规则是 可能会改变。)
这是真的。在python 3中,这是一个TypeError
。
() > []
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-d2326cfc55a3> in <module>()
----> 1 () > []
TypeError: unorderable types: tuple() > list()
回到python 2:文档强调这是任意但一致的排序。
在cPython 2中,根据类型名称比较不相等的类型。因此,tuple
是“大于”list
,按字典顺序排列。
答案 1 :(得分:2)
这是一个CPython(2.x)实现细节,如Built-in Types - Comparisons中所述:
CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
因此,任何元组都比任何列表都要大,因为'tuple' > 'list'
。
这在CPython 3中已不再适用,并且从未用于Python 2.x的其他实现。
答案 2 :(得分:1)
内置类型的大多数其他对象比较不相等,除非它们是同一个对象;一个对象被认为是小于还是大于另一个对象的选择是在程序的一次执行中任意但一致的。
所以它似乎依赖于实现。例如,在CPython中:
除数字外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
答案 3 :(得分:0)
这可能是依赖于实现的,我认为没有直接原因。 Python 3.X禁止在两个不同类型之间进行比较。
答案 4 :(得分:0)
这是因为python 2.x使用方法__cmp__()
Python 3.x不会使用这种方法。
您使用的是低于3.0的python版本
使用python版本3.x,会有一个例外:
TypeError:unorderalbe types ...