O Python representa os valores verdadeiro e falso com o tipo bool, que é uma subclasse de int. Nesse tipo existem apenas dois valores Boolean: True e False. Esses valores podem ser atribuídos a uma variável e combinados com os operadores Boolean (and, or, not):
>>> true_variable = True and True
>>> false_variable = True and False
>>> true_variable = False or True
>>> false_variable = False or False
>>> true_variable = not False
>>> false_variable = not True
Os operadores Boolean usam avaliação de curto-circuito, ou seja, a expressão do lado direito do operador só é avaliada se for necessário.
Cada operador tem uma precedência diferente, e not é avaliado antes de and e or. Os parênteses podem ser usados para avaliar uma parte da expressão antes das outras:
>>> not True and True
False
>>> not (True and False)
True
Todos os boolean operators são considerados de precedência menor que os comparison operators do Python, como ==, >, <, is e is not.
A função bool (bool()) converte qualquer objeto em um valor Boolean. Por padrão, todos os objetos retornam True, a menos que sejam definidos para retornar False.
Alguns built-ins são sempre considerados False por definição:
None e False
int, float, complex, decimal ou fraction)str, list, set, tuple, dict, range(0))>>> bool(None)
False
>>> bool(1)
True
>>> bool(0)
False
>>> bool([1,2,3])
True
>>> bool([])
False
>>> bool({"Pig" : 1, "Cow": 3})
True
>>> bool({})
False
Quando um objeto é usado em um contexto Boolean, ele é avaliado de forma transparente como truthy ou falsey usando bool():
>>> a = "is this true?"
>>> b = []
# This will print "True", as a non-empty string is considered a "truthy" value
>>> if a:
... print("True")
# This will print "False", as an empty list is considered a "falsey" value
>>> if not b:
... print("False")
As classes podem definir como são avaliadas em situações truthy se sobrescreverem e implementarem um método __bool__() e/ou um método __len__().
O tipo bool é implementado como um subtipo de int. Isso significa que True é numericamente igual a 1 e False é numericamente igual a 0. Isso fica visível ao compará-los com um operador de igualdade:
>>> 1 == True
True
>>> 0 == False
True
No entanto, os bools ainda são diferentes dos ints, como se nota ao compará-los com o operador de identidade, is:
>>> 1 is True
False
>>> 0 is False
False
Observação: no Python >= 3.8, usar um literal (como
1,'',[]ou{}) no lado esquerdo deisvai gerar um aviso.
É considerado um antipadrão do Python usar o operador de igualdade para comparar uma variável Boolean com True ou False. Em vez disso, deve-se usar o operador de identidade is:
>>> flag = True
# Not "Pythonic"
>>> if flag == True:
... print("This works, but it's not considered Pythonic.")
# A better way
>>> if flag:
... print("Pythonistas prefer this pattern as more Pythonic.")