Wie funktioniert all () in Python auf leeren Listen?

8

Ich beziehe mich auf den folgenden Python-Code

%Vor%

Ich erwarte, dass der obige Code True zurückgibt, wenn alle Elemente in my_list 2 sind. aber wenn ich my_list leer mache, führe es als

aus %Vor%

es gibt auch True zurück. Ich bin mit diesem Verhalten verwirrt. Soll False nicht zurückgegeben werden, da es in my_list kein Element mit dem Wert 2 gibt?

    
quirkystack 26.10.2013, 01:25
quelle

3 Antworten

14

Das stimmt, denn für jedes Element in der Liste sind alle 0 gleich 2.

Sie können sich vorstellen, dass all wie folgt implementiert wird:

%Vor%

Während any ist:

%Vor%

Das heißt, all ist unschuldig, bis die Schuld bewiesen ist, und any ist schuldig, bis bewiesen ist, dass sie unschuldig ist.

    
OmnipotentEntity 26.10.2013, 01:27
quelle
4

Betrachten Sie eine rekursive Definition von all :

%Vor%

Wenn jedes Element in L wahr ist, dann muss es wahr sein, dass sowohl das erste Element in L wahr ist, und , dass all(L[1:]) wahr ist. Dies ist für eine Liste mit mehreren Elementen leicht zu sehen, aber was ist mit einer Liste mit one -Element. Natürlich ist jeder Gegenstand wahr, wenn der einzige Gegenstand wahr ist, aber wie funktioniert unsere rekursive Formulierung in diesem Fall? Wenn all([]) als wahr definiert wird, funktioniert der Algorithmus.

Eine andere Möglichkeit, es zu betrachten, ist, dass wir für jede Liste L , für die all(L) nicht wahr ist, mindestens ein Element, a , identifizieren können nicht wahr. Allerdings gibt es kein solches a in L , wenn L leer ist, also können wir sagen, dass all([]) wahr ist.

Die gleichen Argumente gelten für any . Wenn any(L) wahr ist, sollten wir in der Lage sein, mindestens ein Element in L zu identifizieren, das wahr ist. Aber da wir für eine leere Liste L nicht können, können wir sagen, dass any([]) falsch ist. Eine rekursive Implementierung von any sichert dies ab:

%Vor%

Wenn L[0] wahr ist, können wir true zurückgeben, ohne jemals den rekursiven Aufruf zu machen, also nehmen wir an, dass L[0] false ist. Die einzige Möglichkeit, den Basisfall zu erreichen, ist, wenn kein Element von L wahr ist Wir müssen False zurückgeben, wenn wir es erreichen.

    
chepner 26.10.2013 02:01
quelle
4

"all" auf eine leere Liste angewendet ist "vacuously true", wie leicht zu bestätigen ist:

%Vor%

Ähnlich ist "wenn 0 = 1 dann ist der Mond quadratisch" wahr. Ganz allgemein, "alle P sind Q" - wenn es keine P gibt, dann wird die Aussage als wahr betrachtet, da sie formell erfasst werden kann als "Für alle x, wenn x P ist, dann ist x Q". Letztendlich sind diese Wahrheiten wahr, weil der bedingte logische Operator (if-then) immer True ergibt, wenn der Antezedens (die erste Klausel) False ist: "if False then True" ergibt True. Erinnern Sie sich, dass "wenn A dann B" gleich "(nicht A) oder B" ist.

    
BrianO 26.10.2013 04:37
quelle