В 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]).
Вопрос
Что здесь происходит? Мне разрешено сравнивать кортежи и списки - или, может быть, мне разрешено сравнивать один и тот же тип с самим собой?
Ответы
Ответ 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