Почему ''> 0 Истинных в Python 2?

В Python 2.x:

>>> '' > 0
True

Почему это?

38
задан wim 21 October 2019 в 15:38
поделиться

2 ответа

Первоначальной мотивацией для разрешения сравнения порядка произвольных объектов было разрешение сортировки разнородных списков - удобно, чтобы все строки располагались рядом друг с другом в алфавитном порядке, а все числа рядом друг с другом в числовом порядке, хотя то, какой из двух блоков окажется первым, не гарантировалось языком. Например, это позволяло получать только уникальные элементы в любом списке (даже в списке с нехешируемыми элементами) за O(N log N) наихудшее время

С годами эта прагматическая схема разрушалась. Первая трещина появилась, когда была убрана возможность упорядоченного сравнения комплексных чисел, довольно много версий назад. Внезапно исчезла возможность сортировки любого списка: она больше не применялась, если список содержал комплексные числа, возможно, вместе с элементами других типов. Затем Гвидо начал не любить неоднородные списки в целом, и, таким образом, стал думать, что на самом деле не имеет значения, могут ли такие списки быть полезно отсортированы или нет... потому что такие списки не должны существовать в первую очередь, согласно его новому мышлению. Он не делал ничего, чтобы запретить их, но и не был склонен принимать какие-либо компромиссы в их поддержку".

Обратите внимание, что оба изменения немного сдвигают баланс в сторону от пункта "практичность побеждает чистоту" из Zen of Python (который был написан раньше, когда комплексные числа еще могли сравниваться по порядку ;-) - немного больше чистоты, немного меньше практичности.

Тем не менее, возможность упорядоченного сравнения двух произвольных объектов (пока ни один из них не был комплексным числом ;-) сохранялась долгое время, потому что примерно в это же время Гвидо начал настаивать на сохранении сильной обратной совместимости (сдвиг, который и практичен и чист ;-).

Так, только в Python 3, который явно и намеренно снял ограничение сильной обратной совместимости, чтобы позволить некоторые давно желаемые, но несовместимые с обратной совместимостью усовершенствования (особенно упрощения и удаление устаревших, избыточных способов выполнения определенных задач), порядковое сравнение экземпляров разных типов стало ошибкой.

Так что этот историко-философский трактат, по сути, единственный способ по-настоящему ответить на ваш вопрос "почему"...! :-)

82
ответ дан 27 November 2019 в 03:12
поделиться

из https://docs.python.org/2.7/tutorial/datastructures.html#id1

Обратите внимание, что сравнение объектов разных типов разрешено. Результат является детерминированным, но произвольным: типы упорядочиваются по их имени. Таким образом, список всегда меньше строки, строка всегда меньше кортежа, и т. д. [1] Смешанные числовые типы сравниваются в соответствии с их числовым значением, поэтому 0 равно 0,0 и т. д.

21
ответ дан 27 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

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