Следующий отрывок аннотируется выводом (как замечено на 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 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()
Строки сравниваются лексикографически, а разные типы сравниваются по имени их типа ( «int»
< «string»
). 3.x исправляет вторую точку, делая их несопоставимыми.