Как Python 2 сравнивает строку и int? Почему списки сравниваются больше, чем числа, а кортежи – больше, чем списки?

Следующий fragment аннотируется с выходом ( как видно на ideone.com ):

print "100"  "9" # False print "100" < 2 # False print 100  "9" # False print "5" > 9 # True print [] > float('inf') # True print () > [] # True 

Может ли кто-нибудь объяснить, почему вывод как таковой?


Детали реализации

  • Является ли это поведение обязательным для спецификации языка, или это зависит от разработчиков?
  • Существуют ли различия между любыми основными реализациями Python?
  • Существуют ли различия между версиями языка Python?

Из руководства python 2 :

Подробности реализации CPython: объекты разных типов, кроме номеров, упорядочены по их именам типов; объекты того же типа, которые не поддерживают надлежащее сравнение, упорядочиваются по их адресу.

Когда вы заказываете две строки или два числовых типа, упорядочение выполняется ожидаемым образом (лексикографическое упорядочение для строки, числовое упорядочение для целых чисел).

Когда вы заказываете числовой и нецифровой тип, сначала вводится числовой тип.

 >>> 5 < 'foo' True >>> 5 < (1, 2) True >>> 5 < {} True >>> 5 < [1, 2] True 

Когда вы заказываете два несовместимых типа, где они не являются числовыми, они упорядочиваются по алфавитному порядку их имен:

 >>> [1, 2] > 'foo' # 'list' < 'str' False >>> (1, 2) > 'foo' # 'tuple' > 'str' True >>> class Foo(object): pass >>> class Bar(object): pass >>> Bar() < Foo() True 

Одним из исключений являются classы старого стиля, которые всегда появляются перед classами нового стиля.

 >>> class Foo: pass # old-style >>> class Bar(object): pass # new-style >>> Bar() < Foo() False 

Является ли это поведение обязательным для спецификации языка, или это зависит от разработчиков?

Спецификация языка отсутствует . В справочнике языка говорится:

В противном случае объекты разных типов всегда сравниваются неравномерно и упорядочиваются последовательно, но произвольно.

Таким образом, это деталь реализации.

Существуют ли различия между любыми основными реализациями Python?

Я не могу ответить на этот вопрос, потому что я использовал только официальную реализацию CPython, но есть и другие реализации Python, такие как PyPy.

Существуют ли различия между версиями языка Python?

В Python 3.x поведение было изменено, так что попытка упорядочить целое число и строку вызовет ошибку:

 >>> '10' > 5 Traceback (most recent call last): File "", line 1, in  '10' > 5 TypeError: unorderable types: str() > int() 

Строки сравниваются лексикографически, а разнородные типы сравниваются по имени их типа ( "int" < “string” ). 3.x фиксирует вторую точку, делая их несопоставимыми.

CPython implementation detail: объекты разных типов, кроме номеров, упорядочены по их именам типов; объекты того же типа, которые не поддерживают надлежащее сравнение, упорядочиваются по их адресу.

  • long / bigint / десятичный эквивалентный тип данных в R
  • Совместимость шаблонов с несколькими типами Scala
  • Как разрешить «должен быть экземпляр строки, строка, заданная» до PHP 7?
  • В чем разница между (типом) значением и типом (значением)?
  • Как установить значение составного поля переменных с помощью динамического SQL
  • Каков правильный тип индексов массивов в C?
  • Interesting Posts

    Как скопировать Ctrl + A и Ctrl + Shift + по-другому?

    Саморегуляция между кодами рекурсивных отношений ко многим ко многим первым Entity Framework

    Установите и запустите 32-разрядную версию на 64-битной машине

    Текст был усечен или один или несколько символов не совпадали на целевой кодовой странице. При импорте из файла Excel

    Удаление пароля из файла PDF

    Maven in Eclipse: пошаговая установка

    Пользовательские обои для Windows 7

    Почему «SwitchTo» был удален из Async CTP / Release?

    Планирование задачи программы GUI и отображение ее графического интерфейса при входе в систему

    Spring Boot & JPA: реализация поисковых запросов с дополнительными критериями дальности

    В чем разница между MyISAM и InnoDB?

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

    как вычислять среднее / медианное значение для каждой группы в кадре данных в r

    Постоянно выделять все вхождения текста в Notepad ++?

    Вызов java-метода в jsp

    Давайте будем гением компьютера.