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

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

print "100" < "2"      # True
print "5" > "9"        # False

print "100" < 2        # False
print 100 < "2"        # True

print 5 > "9"          # False
print "5" > 9          # True

print [] > float('inf') # True
print () > []          # True

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


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

  • Это поведение передано под мандат спецификацией языка или является ею до конструкторов?
  • Есть ли различия между какой-либо из реализаций майора Python?
  • Есть ли различия между версиями языка Python?

172
задан ivan_pozdeev 18 July 2018 в 19:40
поделиться

2 ответа

Из руководства 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 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 "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()
204
ответ дан 23 November 2019 в 20:40
поделиться

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

23
ответ дан 23 November 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: