2013-10-26 11 views
8

ja odnoszę się do następującego kodu PythonaJak to wszystko() w pracy Pythona na pustych list

all(a==2 for a in my_list) 

Spodziewam się, że powyższy kod zwraca True jeśli wszystkie elementy są w my_list 2. ale kiedy make my_list puste i uruchomić go jako

my_list = [] 
all(a==2 for a in my_list) 
zwraca również True. Jestem zdezorientowany tym zachowaniem. Czy nie powinien zwracać Fałszy, ponieważ nie ma elementu w my_list z wartością 2?

+0

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) –

Odpowiedz

14

To prawda, ponieważ dla każdego elementu na liście, wszystkie 0 z nich, wszystkie one są równe 2.

Można myśleć o all realizowane jako:

def all(list, condition): 
    for a in list: 
    if not condition(a): 
     return false 
    return true 

Zważywszy any jest:

def any(list, condition): 
    for a in list: 
    if condition(a): 
     return true 
    return false 

to znaczy, all jest niewinny do czasu udowodnienia winy, a any jest winny, dopóki nie udowodni niewinny.

+0

Uwielbiam analogię! Dziękuję za to :) – AetherUnbound

4

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.

4

„wszystkie”, stosowane do pustej listy jest „próżniowo prawdziwy”, jak to jest łatwo potwierdzone:

>>> all([]) 
True 

Podobnie „jeśli 0 = 1, to moon kwadratu” jest prawdziwe. Bardziej ogólnie, "wszystkie P to Q" - jeśli nie ma żadnych P, to stwierdzenie jest uważane za prawdziwe, ponieważ może ono być uchwycone formalnie jako "Dla wszystkich x, jeśli x to P, to x to Q". Ostatecznie są one prawdziwe, ponieważ warunkowy operator logiczny (jeśli-wtedy) zwraca wartość True, gdy poprzednik (pierwsza klauzula) jest Fałsz: "jeśli Fałszywe, Prawdziwe" oznacza wartość Prawda. Przypomnij sobie, że "jeśli A, a następnie B" jest równoważne "(nie A) lub B".

Powiązane problemy