2013-03-02 2 views
0

Недавно я был удивлен, обнаружив, что вы можете взять min() аргументов разных типов в Python и не получить ValueError.Python min() аргументов с разными типами

min(3, "blah") ==> 3 
min(300, 'zzz') ==> 300 

документация неясна на этом - это как раз говорю мин() принимает «наималейшая из аргументов». Как это на самом деле определяет, какой элемент является наименьшим?

ответ

0

В Python 2 существует произвольное, но предсказуемое сравнение значений с разными типами. Я думаю, что это было похоже на лексикографическое сравнение названия типа (ints < floats < strs < кортежи).

1

Он определяет это, сравнивая их, используя обычные правила. Если объекты имеют разные типы и не могут сравниться разумно (потому что ни один из них не реализует требуемые специальные методы, или реализация не работает с типом другого объекта), тогда им присваивается последовательный порядок по типу; например, все целые числа меньше всех строк. Попробуйте: 1 < "1"

(Кстати, Booleans реализуются как подкласс целых чисел, и их можно сравнить с числами, так что они будут сортировать False как 0 и True как 1.)

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

0

Это правильно по определению Пайтона заказа:

>>> 3 < "blah" 
True 
>>> 300 < 'zzz' 
True 

rule является:

Если оба номера, они преобразуются к общему типу. В противном случае объекты разных типов всегда сравниваются неравномерно и упорядочиваются последовательно, но произвольно.

Смежные вопросы