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

В Python 2.x:

>>> '' > 0
True

Почему это?

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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