2012-07-31 37 views
7

Sprawdzałem listę, aby sprawdzić, czy jest pusta, czy nie. Zwykle używam len (list) == 0 i niewyraźnie pamiętałem, że przeczytałem jakiś czas temu, że prawidłowym sposobem sprawdzenia, czy lista jest pusta, było to, czy była to prawda czy fałsz.Testowanie listy w języku Boolean w języku Python

Więc spróbowałem, że lista jest fałszywa, a to zwróciło fałsz. Może powinienem używać ==? Nie, które również zwróciło fałsz. lista ma wartość True, zwracana jest wartość false, tak jak lista == True.

Teraz jestem zdezorientowany więc zrobić szybkie google i kończy się pod adresem: Best way to check if a list is empty

Górny odpowiedź brzmi:

if not a: 
    print "List is empty" 

Więc szukać wokół trochę więcej i kończy się w instrukcji Pythona gdzie 4.1 oznacza:

Każdy obiekt może zostać przetestowany pod kątem wartości true, do użycia w warunku, jeśli lub w czasie, lub jako operand w operacjach Boolean poniżej. Następujące wartości są uważane za fałszywe:

dowolna pusta sekwencja, na przykład '',(), [].

Teraz jestem zmieszany. Jeśli testuję listę tak, jak nie ma ona listy, działa dobrze. Ale jeśli pusta lista jest fałszywa, to dlaczego nie mogę zrobić, jeśli lista jest fałszywa lub jeśli lista == fałsz?

Dzięki

Odpowiedz

11

Pusta lista nie jest fałszywy, ale kiedy je przekształcić do wartości logicznej, konwertuje do False. Podobnie dla dicts, krotki, smyczki, itp .:

>>> [] == False 
False 
>>> bool([]) == False 
True 
>>> {} == False 
False 
>>> bool({}) == False 
True 

Kiedy można umieścić coś w warunkach klauzuli if, to jego wartość logiczna, która jest używana do testowania if. Dlatego if someList jest taki sam jak if bool(someList). Podobnie, not foo ma wartość boolean, więc not [] jest równa True.

+0

W szczególności nazywa się metodę [__nonzero__] (http://docs.python.org/reference/datamodel.html#object.%5F%5Fnonzero%5F%5F) – ernie

0

Porównywanie listy do False i testowanie prawdy lub fałszu listy to nie to samo. Pusta lista nie jest równa False, ale zachowuje się jako False w kontekście boolowskim.

Oto kolejny sposób, żeby to powiedzieć, że może pomóc to ma sens:

print (bool([]) == False) # will print True 
print ([] == False) # will print False 
2

Jako inny powiedział, w python bool([]) == False. Jedną z rzeczy, która jest często wykorzystywana przez programistów Pythona, jest to, że operatory and i or nie (koniecznie) zwracają True/False. Rozważmy następujący:

3 and 4 #returns 4 
0 and 8 #returns 0 -- This is short-circuit evaluation 
0 or 8 #returns 8 
True or 0 #returns True -- This is short-circuit evaluation 

[] or False #returns False 
False or [] #returns [] 

Co dzieje się w instrukcji if jest, że warunek zostanie oceniona jak wyżej, a następnie pyton niejawnie wywołuje bool na wynik - tak można myśleć o tym jak:

if condition: 

to samo, co:

if bool(condition): 

miarę python jest zaniepokojony.Podobnie dla operatora not:

not condition 

to samo, co

not bool(condition) 
1

mylist is False pomocą "jest obiekt o nazwie mylistdokładnie ten sam obiekt jak False?"

mylist == False oznacza "jest obiekt o nazwie mylistrównaFalse?

not mylist oznacza" jest obiektem o nazwie mylist zachowywać falsily?


Żaden z nich nie są równoważne: 1 is not 1.0 ale 1 == 1.0 i [] != False ale not [] is True.