Em python, tudo é verdade (True) excepto: os containers vazios (listas vazias, sets vazios,...), None (o equivalente ao null noutros mundos) e 0. Espero não estar a esquecer casos. Vou usar a função bool() para exemplificar:
>>> bool(0)
False
>>> bool(1)
True
>>> bool([])
False (lista vazia é interpretada como falsa)
>>> bool([1])
True (lista não vazia é interpretada como verdade)
>>> bool([1,2])
True
>>> bool(())
False (tuplo vazia é interpretada como falso)
>>> bool((None))
False (None é falso)
>>> bool((None,))
True (Tuplo com None já é True)
>>> bool(False)
False
>>> bool(not False)
True
>>> bool(list)
True (Um tipo também é verdadeiro)
>>> list
>>>
A avaliação de expressões booleanas do tipo a and b tem também as suas peculiariedades:
Primeiro ver se a é true. Se não for então o valor da expressão é a. Se for, então o valor da expressão é b.
Isto é chamado de short circuiting e existe em outras linguagens também, mas a peculiarieadade é que, juntamente com o facto de muitas coisas serem True ou False podemos ter construções muito interessantes.
Por exemplo:
if a:
print a
else:
print b
pode ser simplesmente escrito como print a or b o que imprime a ou b consoante a seja interpretado como verdade ou b casocontrário.
Veja-se:>>> print [1] or [2]
[1]
>>> print [1] or []
[1]
>>> print [] or [2]
[2]
>>>