19

背景

我一直在试图弄清楚为什么我的 AI 一直在做出一些疯狂的举动,并且我将问题追溯到使用 Python 2.7.2 时的以下行为

>>> print [2]>[1]
True
>>> print (2,)>(1,)
True
>>> print [2]>(1,)
False                 (WHY?)

>>> print [2]<[1]
False
>>> print (2,)<(1,)
False
>>> print [2]<(1,)
True                  (WHY?)

它似乎表现得好像列表总是小于元组。

这不是我对文档的期望

元组和列表使用对应元素的比较按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同的类型并且具有相同的长度。

如果不相等,则序列的排序与其第一个不同的元素相同。例如, cmp([1,2,x], [1,2,y]) 返回与 cmp(x,y) 相同的结果。如果对应的元素不存在,则先排序较短的序列(例如,[1,2] < [1,2,3])。

问题

这里发生了什么?我是否允许比较元组和列表 - 或者我是否只允许将同一类型与其自身进行比较?

4

2 回答 2

26

比较时不强制序列,因此比较它们的类型名称。

>>> 'list' < 'tuple'
True
于 2013-06-28T19:05:13.857 回答
23

他们不是同一类型。

每个元素必须比较相等,并且两个序列必须是相同的类型并且具有相同的长度

因此,比较是根据类型执行的,而不是基于存储在序列中的实际数据。在 python3.x 上,这个比较提出了一个TypeError

Python 3.2 (r32:88445, May 11 2011, 09:23:22) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> [2] > (1,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: list() > tuple()
于 2013-06-28T19:04:39.810 回答