Warum halten Python-Sets ausschließlich False und Zero?

8

beim Erstellen eines Sets:

%Vor%

oder ein Wörterbuch, das das Verhalten etwas nachahmt:

%Vor%

0 und False entfernen einander immer aus der Menge. Bei Wörterbüchern sind sie insgesamt falsch. Gibt es dafür einen Grund? Während ich weiß, dass Boolesche Werte von Integern in Python abgeleitet sind. Was ist die pythonische Argumentation dafür, so im Kontext von Sets zu handeln (Wörterbücher interessieren mich nicht zu sehr)? Seit wann nützlich im truthy Vergleich wie:

%Vor%

Es gibt einen offensichtlichen Wert in der Differenzierung:

%Vor%

Ich habe über die Dokumentation nachgedacht und kann ' Es scheint, dass Sie eine Referenz für das Verhalten finden

Aktualisieren

@delnan Ich denke, du hast den Nagel auf den Kopf getroffen mit dem Hash-Determinismus, den du in den Kommentaren erwähnt hast. Wie @mgilson bemerkt, verwenden sowohl False als auch 0 die gleiche Hashing-Funktion, jedoch auch object und viele seiner Unterklassen (zB: super ), die den identischen Hash haben Funktionen. Der Schlüssel scheint in der Phrase Hashable objects which compare equal must have the same hash value aus der Dokumentation zu stehen. Da, Falsch == 0 und beide Hashes sind, müssen ihre Ausgaben nach Pythons Definition äquivalent sein. Schließlich gibt die Definition von hashable an, wie Sets die Hash-Fähigkeit in der Set-Mitgliedschaft verwenden:% co_de Obwohl ich immer noch nicht verstehe, warum sie beide die gleiche Hash-Funktion verwenden, kann ich mich damit begnügen, so tief zu gehen.

Wenn wir uns alle einig sind, schlägt jemand eine ausgefeilte Antwort vor, und ich akzeptiere sie. Wenn es etwas Verbesserung geben könnte oder wenn ich von der Basis bin, dann lass es unten bekannt werden.

    
Marc 09.10.2014, 22:18
quelle

2 Antworten

3

Es liegt daran, dass False und 0 hash auf den gleichen Wert und gleich sind.

Der Grund dafür, dass sie auf denselben Wert hashen, ist, weil bool eine Unterklasse von int ist, also ruft bool.__hash__ einfach dieselbe zugrunde liegende Mechanik auf, die int.__hash__ aufruft ...

%Vor%     
mgilson 09.10.2014 22:24
quelle
0

Lassen Sie uns zuerst versuchen, zu erklären, was am Anfang mit Ihrem falsey_set und falsey_dict passiert. Sie sehen also, dass es nicht "inkorrekt" ist, sondern tatsächlich nur eine konsistente Lösung. Dazu entfernen wir vorübergehend bool s aus dem Bild und verwenden etwas, was mehr Menschen intuitiv verstehen: Dezimalzahlen.

%Vor%

Ich hoffe, Sie stimmen zu, dass set genau so funktionieren sollte. Wenn Sie dies nicht tun, dann scheint es so, als ob Sie entweder 3 und 3.0 nicht wirklich gleich sind, oder Sie denken, dass eine Menge gleiche Elemente haben sollte. Keine dieser beiden sind wirklich produktive Überzeugungen IMO.

(Natürlich, welches von 3 und 3.0 in der Menge landet, ist eine Angelegenheit der Verarbeitung von Anzeigen, und set ist ein bisschen komisch, da es ein verkümmertes Diktat ist, wo Schlüssel und Wert sind Aber es ist konsistent und spezifiziert in Pythton. Der Punkt für jetzt ist, sicher können sie nicht beide in einem Satz sein.)

Noch ein weiterer Punkt: Wie du siehst, spielt es keine Rolle, dass ich viele andere wahre Dinge in mein Set aufnehmen kann (wie 4 und 5 ). Das gleiche, die Tatsache, dass Sie viele andere falsche Dinge in Ihrem Set hinzufügen können (wie '' und None ), spielt überhaupt keine Rolle. Die Wahrheit ist ein Ablenkungsmanöver. Ein Satz kann wahre Elemente und falsche Elemente haben. Was nicht sein kann, ist gleich Elemente.

%Vor%

Das sieht auf den ersten Blick etwas seltsamer aus, ist aber viel deutlicher, was los ist, da Schlüssel und Werte getrennt sind. Python-Regeln sind präzise: Lies die dict-Anzeige von links nach rechts, nimm jedes Paar a : b , wenn Schlüssel a bereits im dict ist Aktualisieren Sie den Wert auf b , andernfalls fügen Sie den Schlüssel a in das dict mit dem Wert b ein.

Bei diesem Algorithmus ist es offensichtlich, dass das endgültige Diktat so endet und all die anderen Verhaltensweisen, die Sie bemerkt haben. Was wichtig ist, ist, dass Sie, wie in einem Set, wirklich brauchen, um nur einen Wert für einen bestimmten Schlüssel zu haben. Zwei gleiche Schlüssel im selben dict zu haben wäre eine Einladung zum Desaster, denn dann könnten Sie ihnen verschiedene Werte zuweisen.

Kurz gesagt: Ich denke, Sie haben sich zu sehr mit Hash-Funktionen und anderen Implementierungskram beschäftigt. Das ist eine nette Art zu sehen, wie Python X, einmal erkennt, dass X das Richtige ist. Aber zuerst müssen Sie sehen, dass X das Richtige ist. Und ich hoffe, ich habe es dir jetzt gezeigt. Ein Set kann nicht die gleichen Elemente enthalten. Es würde einen weit verbreiteten Zweck eines Sets besiegen und Duplikate entfernen. Und 3 und 3.0 sind wirklich gleich. Das hat nichts mit Typen zu tun, einige Einbettungen sind so natürlich, dass wir sie auf mathematischer Ebene gelöscht haben.

Natürlich bleibt die Frage "Warum sind 0 und Falsch wirklich gleich"? Tatsächlich ist die Antwort nicht sehr unterschiedlich: nur eine weitere mathematisch gelöschte Einbettung, die so unglaublich nützlich ist, müssten wir ohne sie durch viele lächerliche Reifen springen. Lesen Sie dazu mehr über Iverson Bracket. ;-) Aber wie auch immer, es scheint, dass du über diesen Teil weißt. Das obige ist was problematisch ist, denke ich.

    
Veky 17.01.2015 03:26
quelle

Tags und Links