Ответ 1
min
выполняется примерно так:
def min(*args):
least = args[0]
for arg in args:
if arg < least:
least = arg
return least
То, как работают операторы сравнения для множеств, нарушает одно из предположений, которое это неявно делает: для каждой пары объектов либо они равны, либо a < b
или b < a
. Ни {0}
, ни {1}
не сравниваются друг с другом, поэтому min
дает вам непоследовательные ответы.
Другие результаты, которые вы видите, связаны с правилами, определяющими порядок использования Python для смешанных типов. A set
и a int
не сопоставимы - ни один из этих типов не определяет правило для сравнения с другим. Это приводит к тому, что Python 2 применяет правило "произвольный, но последовательный порядок" - один из типов выбирается как "нижний" тип, и он останется нижним типом для времени жизни программы. На практике это будет одинаково для всего кода, который вы запускаете, потому что он реализуется путем сравнения имен типов в алфавитном порядке - но теоретически это может измениться.
Правило произвольного, но согласованного порядка было выгружено из Python 3, потому что единственный эффект, который он действительно имел, - это маскировать ошибки. Когда нет определенного правила для поиска порядка, Python теперь говорит вам следующее:
>>> 1 < {0}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < set()