Подтвердить что ты не робот

В Python почему [2] меньше (1)?

ПРЕДПОСЫЛКИ

Я пытался выяснить, почему мой ИИ совершил какие-то сумасшедшие шаги, и я проследил проблему до следующего поведения при использовании 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]).

Вопрос

Что здесь происходит? Мне разрешено сравнивать кортежи и списки - или, может быть, мне разрешено сравнивать один и тот же тип с самим собой?

4b9b3361

Ответ 1

Они не такие же.

каждый элемент должен сравнивать равные и , что две последовательности должны быть одного типа и иметь одинаковую длину

Итак, сравнение выполняется на основе типа, а не на фактических данных, хранящихся в последовательностях. На 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()

Ответ 2

После сравнения не выполняются последовательности, поэтому вместо них сопоставляется их имя типа.

>>> 'list' < 'tuple'
True