web-dev-qa-db-fra.com

'True' et 'False' dans Python

J'ai essayé d'exécuter ce morceau de code:

path = '/bla/bla/bla'

if path is True:
    print "True"
else:
    print "False"

Et cela imprime False. Je pensais que Python traite tout ce qui a de la valeur comme True. Pourquoi cela se produit-il?

53
PSS

De http://docs.python.org/reference/expressions.html#boolean-operations :

Dans le contexte des opérations booléennes, ainsi que lorsque des expressions sont utilisées par des instructions de flux de contrôle, les valeurs suivantes sont interprétées comme étant fausses: False, Aucun, zéro numérique de tous les types et chaînes et conteneurs vides (y compris des chaînes, des n-uplets, des listes et des dictionnaires). , ensembles et frozensets). Toutes les autres valeurs sont interprétées comme vraies.

La phrase clé ici que je pense que vous comprenez mal est "interprétée comme fausse" ou "interprétée comme vraie". Cela ne signifie pas qu'aucune de ces valeurs ne soit identique à True ou False, ni même à True ou False.

L'expression '/bla/bla/bla' sera traité comme vrai lorsqu'une expression booléenne est attendue (comme dans une instruction if), mais les expressions '/bla/bla/bla' is True et '/bla/bla/bla' == True sera évalué à False pour les raisons exposées dans la réponse d'Ignacio.

66
Andrew Clark

is compare l'identité. Une chaîne ne sera jamais identique à une chaîne non.

== est l'égalité. Mais une chaîne ne sera jamais égale à True ou False.

Vous ne voulez ni l'un ni l'autre.

path = '/bla/bla/bla'

if path:
    print "True"
else:
    print "False"
101

Tandis que les autres affiches expliquaient pourquoi is True fait ce qu'il fait, je voulais répondre à cette partie de votre message:

Je pensais que Python considère que tout ce qui a de la valeur est True. Pourquoi cela se produit-il?

Venant de Java, je me suis aussi laissé prendre à cela. Python ne traite rien avec une valeur comme True. Témoin:

if 0:
    print("Won't get here")

Cela n'imprimera rien car 0 est traité comme False. En fait, zéro de tout type numérique est évalué à False. Ils ont également fait fonctionner decimal comme vous le souhaitiez:

from decimal import *
from fractions import *

if 0 or 0.0 or 0j or Decimal(0) or Fraction(0, 1):
    print("Won't get here")

Voici l'autre valeur qui donne False:

if None or False or '' or () or [] or {} or set() or range(0):
    print("Won't get here")

Sources:

  1. https://medium.com/@dawran6/python-truth-value-testing-is-awesome-dae6c23cc1c2
  2. https://docs.python.org/3.7/library/stdtypes.html#truth-value-value-testing
3
Trenton