Почему ''> 0 истинно в Python 2? - PullRequest
36 голосов
/ 05 марта 2010

В Python 2.6.4:

>> ''>0
True

Почему это?

Ответы [ 2 ]

77 голосов
/ 05 марта 2010

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

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

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

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

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

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

21 голосов
/ 05 марта 2010

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

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

...