Warum ein expliziter Test für eine leere Menge nicht funktioniert

8

Wenn leer set() ist False , sollte die if test == False -Klausel im folgenden Code nicht zu True ausgewertet werden?

%Vor%

Ausgabe:

%Vor%     
AgentBlueNote 31.10.2015, 14:40
quelle

3 Antworten

9

Vereinfacht gesagt wird der Gleichheitsoperator == einen Gleichheitsvergleich zwischen diesen beiden Objekten durchführen: Eine Menge und ein boolescher Wert werden niemals gleich sein, daher ist das Ergebnis des Vergleichs falsch. Auf der anderen Seite überprüft nur if obj (oder if not obj ) die Richtigkeit des Objekts, was für jedes Objekt ausgewertet werden kann. In gewisser Weise macht dies tatsächlich eine Typumwandlung mit if bool(obj) . Und für leere Mengen ist das falsch.

Diese beiden Vorgänge rufen im Datenmodell verschiedene spezielle Methodennamen auf. Beim Vergleich zweier Objekte mit dem Gleichheitsoperator wird __eq__ aufgerufen, während bool() aufgerufen wird Ein Objekt ruft __bool__ auf.

    
poke 31.10.2015, 14:49
quelle
5

Der Operator == prüft die Werte von 2 Objekten und in diesem Fall haben ein leerer set() und ein falscher Wert keinen gleichen Wert.

Und da Python jede leere Sequenz als False und keine leeren Sequenzen als True bewertet, können Sie, wenn Sie die Validierung des test -Objekts überprüfen möchten, einfach if :

verwenden %Vor%
  

Wahrheitswert testen

     

Jedes Objekt kann auf Wahrheitswert getestet werden, um es in einer if- oder while-Bedingung oder als Operand der folgenden booleschen Operationen zu verwenden. Die folgenden Werte gelten als falsch:

     
  • Listenelement

  •   
  • Keine

  •   
  • Falsch

  •   
  • Null eines beliebigen numerischen Typs, z. B. 0, 0.0, 0j.

  •   
  • eine leere Sequenz, zum Beispiel '', (), [].

  •   
  • jede leere Zuordnung, z. B. {}.

  •   
  • Instanzen von benutzerdefinierten Klassen, wenn die Klasse eine Methode __bool__() oder __len__() definiert, wenn diese Methode die Ganzzahl null oder den bool-Wert False zurückgibt.

  •   

Alle anderen Werte werden als wahr betrachtet - also sind Objekte vieler Typen immer wahr.

    
Kasramvd 31.10.2015 14:43
quelle
2

Der entscheidende Punkt ist, dass False nicht der einzige Wert ist, der als falsch angesehen wird. Eine leere Menge wird in der Bedingung ebenfalls als falsch interpretiert.

Der explizite Gleichheitstest test == False ist jedoch nicht wahr, weil eine leere Menge als Definition vom Typ set ist, die niemals einem booleschen Wert False entspricht.

Siehe Boolesche Operationen :

  

Im Kontext boolescher Operationen und auch wenn Ausdrücke von Steuerflussanweisungen verwendet werden, werden die folgenden Werte als falsch interpretiert: False , None , numerische Null aller Typen und leere Strings und Container (einschließlich Strings, Tupel, Listen, Wörterbücher, Sets und frozensets). Alle anderen Werte werden als wahr interpretiert. Benutzerdefinierte Objekte können ihren Wahrheitswert anpassen, indem sie eine __bool__() -Methode bereitstellen.

    
Yu Hao 31.10.2015 14:48
quelle

Tags und Links