Verwirrt über ein Python min Quiz

Gerade jetzt sah ich ein Quiz auf dieser Seite :

>>> x, y = ??? >>> min(x, y) == min(y, x) False 

Die Beispielantwort ist

 x, y = {0}, {1} 

Aus der Dokumentation weiß ich:

Min (iterable [, key = func]) -> Wert
Min (a, b, c, … [, Schlüssel = func]) -> Wert

Mit einem einzigen iterable Argument, geben Sie seine kleinste Artikel.
Mit zwei oder mehr Argumenten, gib das kleinste Argument zurück.

Aber warum ist min({0},{1})={0} und min({1},{0})={1} ?

Ich habe auch ein paar andere ausprobiert:

 min({0,2},1) # 1 min(1,{0,2}) # 1 min({1},[2,3]) # [2,3] min([2,3],1) # 1 

3 Solutions collect form web for “Verwirrt über ein Python min Quiz”

min ist etwa so umgesetzt:

 def min(*args): least = args[0] for arg in args: if arg < least: least = arg return least 

Die Art und Weise, wie die Vergleichsoperatoren für Sets arbeiten, zerbricht eine der Annahmen, die dies implizit macht: dass für jedes Paar von Objekten entweder gleich oder a < b oder b < a . Weder {0} noch {1} vergleichen sich weniger als einander, also min gibt dir inkonsistente Antworten.

Die anderen Ergebnisse, die Sie sehen, sind wegen der Regeln, wie Python einen Auftrag für gemischte Typen definiert. Ein set und ein int sind nicht vergleichbar – keiner dieser Typen definiert eine Regel für den Vergleich mit dem anderen. Dies führt dazu, dass Python 2 eine Regel namens "willkürliche, aber konsistente Ordnung" anwendet – einer der Typen wird als der "untere" Typ gewählt, und es bleibt der untere Typ für die Lebensdauer des Programms. In der Praxis wird es das gleiche über alle Code, den Sie laufen, weil es durch den Vergleich der Typnamen alphabetisch umgesetzt wird – aber in der Theorie, die sich ändern könnte.

Die "willkürliche, aber konsequente Ordnung" -Regel wurde von Python 3 abgelegt, weil der einzige Effekt, den es wirklich hatte, war, Bugs zu maskieren. Wenn es keine definierte Regel für die Suche nach einem Auftrag gibt, sagt uns Python:

 >>> 1 < {0} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: int() < set() 

Die Vergleichsoperatoren < , <= , >= und > prüfen, ob ein Satz eine strenge Teilmenge, Untermenge, Superset oder eine strenge Obermenge eines anderen ist.

{0} und {1} sind False für all diese, also das Ergebnis hängt von der Scheckordnung und dem Operator ab.

Der entscheidende Punkt hier ist, die beiden Sätze sind keine Untermengen von einander, also sind beide False für < , obwohl sie nicht gleich sind:

 >>> {0} < {1} False >>> {0} > {1} False >>> {0} == {1} False 

Also was ist kleiner? Die Tatsache, dass Sets nicht bieten strenge schwache Bestellung bedeutet, es gibt keine richtige Antwort.

Python ist die beste Programmiersprache der Welt.