Python rappresenta i valori vero e falso con il tipo bool, che è una sottoclasse di int.
In questo tipo ci sono solo due valori booleani: True e False.
Questi valori si possono assegnare a una variabile e combinare con gli operatori booleani (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
Gli operatori booleani usano la valutazione a cortocircuito: l'espressione a destra dell'operatore viene valutata solo se serve.
Ogni operatore ha una precedenza diversa: not viene valutato prima di and e or.
Le parentesi si possono usare per valutare una parte dell'espressione prima delle altre:
>>> not True and True
False
>>> not (True and False)
True
Tutti gli boolean operators hanno una precedenza inferiore rispetto agli comparison operators di Python, come ==, >, <, is e is not.
La funzione bool (bool()) converte qualsiasi oggetto in un valore booleano.
Per impostazione predefinita tutti gli oggetti restituiscono True, a meno che non sia definito che restituiscano False.
Alcuni built-ins sono sempre considerati False per definizione:
None e False
int, float, complex, decimal o 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 un oggetto viene usato in un contesto booleano, viene valutato in modo trasparente come truthy o falsey tramite 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")
Le classi possono definire come vengono valutate nelle situazioni truthy se sovrascrivono e implementano un metodo __bool__() e/o un metodo __len__().
Il tipo bool è implementato come sottotipo di int.
Questo significa che True è numericamente uguale a 1 e False è numericamente uguale a 0.
Lo si osserva confrontandoli con un operatore di uguaglianza:
>>> 1 == True
True
>>> 0 == False
True
Tuttavia, i bools sono comunque diversi dagli ints, come si nota confrontandoli con l'operatore di identità, is:
>>> 1 is True
False
>>> 0 is False
False
Nota: in python >= 3.8, usare un letterale (come
1,'',[]o{}) sul lato sinistro diisgenera un avviso.
Usare l'operatore di uguaglianza per confrontare una variabile booleana con True o False è considerato un anti-pattern di Python.
Al suo posto, conviene usare l'operatore di identità 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.")