Rozważmy rekurencyjną definicję all
:
def all(L):
if L:
return L[0] and all(L[1:])
else:
???
Jeśli każdy element L
jest prawdą, to musi być prawdą, że zarówno pierwszy element L
jest prawdą, i że all(L[1:])
jest prawdą. Jest to łatwe do zobaczenia dla listy z kilkoma pozycjami, ale co z listą z pozycją jeden element. Oczywiście, każdy przedmiot jest prawdziwy, jeśli jedyny przedmiot jest prawdziwy, ale jak działa nasze rekurencyjne sformułowanie? Zdefiniowanie wartości all([])
powoduje, że algorytm działa.
Innym sposobem na to patrzeć jest to, że dla każdej listy L
dla których all(L)
jest nie prawdziwe, powinniśmy być w stanie określić co najmniej jeden element, a
, co nie jest prawdą. Jednak nie ma takiego a
w L
, gdy L
jest pusty, więc uzasadnione jest stwierdzenie, że all([])
jest prawdziwe.
Te same argumenty działają dla any
. Jeśli any(L)
jest prawdziwe, powinniśmy być w stanie zidentyfikować co najmniej jeden element w L
, który jest prawdziwy. Ale ponieważ nie możemy podać pustej listy L
, możemy powiedzieć, że any([])
jest fałszywe. Rekurencyjna realizacja any
To potwierdza:
def any(L):
if L:
return L[0] or any(L[1:])
else:
return False
Jeśli L[0]
jest prawdą, możemy powrócić prawda nigdy dokonywania wywołanie rekurencyjne, więc zakładamy L[0]
jest fałszywe. Jedyny sposób, w jaki kiedykolwiek osiągniemy skrzynkę podstawową, to fakt, że żaden element z L
nie jest prawdziwy, więc jeśli chcemy osiągnąć, musimy zwrócić False
.
możliwy duplikat [Przyczyna "wszystkich" i "dowolnych" wyników na pustych listach] (http://stackoverflow.com/questions/3275058/reason-for-all-and-any-result-on-empty- list) –