2012-07-31 16 views
7

Estaba probando una lista para ver si está vacía o no. Normalmente uso len (list) == 0 y recuerdo vagamente haber leído hace poco que la forma correcta de comprobar si una lista está vacía era si era verdadera o falsa.Boolean probando una lista en Python

así que traté lista es falsa, y que devuelve false. ¿Tal vez debería usar ==? No, eso también devolvió falso. list es True, devuelto false como did list == True.

Ahora estoy confundido por lo que hago un google rápida y terminan en: Best way to check if a list is empty

La respuesta más común es:

if not a: 
    print "List is empty" 

Así que buscar alrededor un poco más y terminan en el manual del pitón donde 4.1 estados:

cualquier objeto puede ser probados para valor de verdad, para uso en un si o mientras condición o como operando de las operaciones booleanas de abajo. Los siguientes valores se consideran falsa:

cualquier secuencia vacía, por ejemplo, '',(), [].

Ahora estoy completamente confundido. Si pruebo una lista como si no fuera lista, funciona bien. Pero si una lista vacía es falsa, ¿por qué no puedo hacer si la lista es False o si list == False?

Gracias

Respuesta

11

Una lista vacía no es falso, pero cuando se lo convierte a un valor lógico, se convierte en Falso. Lo mismo sucede con dicts, tuplas, cuerdas, etc .:

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

Cuando se pone algo en la condición de una cláusula if, es su valor booleano que se utiliza para probar la if. Es por eso que if someList es lo mismo que if bool(someList). Del mismo modo, not foo no tiene un valor booleano, por lo que not [] es igual a Verdadero.

+0

Específicamente, se llama al método [__nonzero__] (http://docs.python.org/reference/datamodel.html#object.%5F%5Fnonzero%5F%5F) – ernie

0

Comparando la lista de False, y prueba de verdad o falsedad de la lista no son exactamente lo mismo. Una lista vacía no es igual a False, pero se comporta como False en un contexto booleano.

Ésta es otra manera de decirlo que podrían ayudar a esto sentido:

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

Como otros han dicho, en python bool([]) == False. Una cosa que los programadores de Python suelen explotar es que los operadores and y or no devuelven (necesariamente) True/False. Considere lo siguiente:

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 [] 

¿Qué ocurre en una declaración if es que la condición se evalúa como anteriormente y después pitón llama implícitamente bool en el resultado - Así que usted puede pensar en ella como:

if condition: 

es lo mismo que:

if bool(condition): 

en lo que se refiere a pitón.Del mismo modo para el operador not:

not condition 

es lo mismo que

not bool(condition) 
1

mylist is False medios "es el objeto nombrado mylistexactamente el mismo objeto comoFalse?"

mylist == False medios "es el objeto nombrado mylistigual aFalse?

not mylist significa" no el objeto nombrado mylist comportarse falsily?


Ninguno de estos son equivalentes: 1 is not 1.0 pero 1 == 1.0 y [] != False pero not [] is True.