105 votes

Est-il sûr de remplacer '==' par 'is' pour comparer des valeurs booléennes

J'ai effectué plusieurs comparaisons booléennes :

>>> (True or False) est vrai
Vrai
>>> (True or False) == True
Vrai

Il semble que == et is sont interchangeables pour les valeurs booléennes.

Parfois, il est plus clair d'utiliser is

Je veux savoir que :

Les Vrai et Faux sont-ils pré-alloués en python?

Est-ce que bool(var) retourne toujours le même Vrai (ou Faux) avec le Vrai (ou Faux) pré-alloué?

Est-il sûr de remplacer == par is pour comparer les valeurs booléennes?


Il ne s'agit pas de la meilleure pratique.

Je veux juste connaître la vérité.

99voto

detly Points 11267

Vous ne devriez probablement jamais avoir besoin de comparer des booléens. Si vous faites quelque chose comme:

if some_bool == True:
  ...

...il suffit de le changer en:

if some_bool:
  ...

Aucun is ou == n'est nécessaire.

Comme l'ont souligné les commentateurs, il existe des raisons valables de comparer des booléens. Si les deux booléens sont inconnus et que vous voulez savoir si l'un est égal à l'autre, vous devriez utiliser == ou != plutôt que is ou is not (la raison est expliquée ci-dessous). Notez que cela est logiquement équivalent à xnor et xor respectivement, qui n'existent pas en tant qu'opérateurs logiques en Python.

En interne, il ne devrait jamais y avoir que deux objets littéraux booléens (voir aussi le C API), et bool(x) is True devrait être True si bool(x) == True pour n'importe quel programme Python. Deux mises en garde:

  • Cela ne signifie pas que x is True si x == True, cependant (par ex. x = 1).
  • Cela est vrai pour la mise en œuvre habituelle de Python (CPython) mais pourrait ne pas être vrai dans d'autres implémentations. Par conséquent, == est une comparaison plus fiable.

61voto

kevpie Points 5243

Faites attention à ce que vous pourriez comparer en plus.

>>> 1 == True
True
>>> 1 is True
False

True et False auront des identifiants d'objet stables pour toute leur durée de vie dans votre instance Python.

>>> id(True)
4296106928
>>> id(True)
4296106928

is compare l'identifiant d'un objet

EDIT : ajout de or

Comme l'OP utilise or dans la question, il peut être utile de le mentionner.

ou qui évalue à True : retourne le premier objet 'True'.

>>> 1 or True
1
>>> 'a' or True
'a'
>>> True or 1
True

ou qui évalue à False : retourne le dernier objet 'False'

>>> False or ''
''
>>> '' or False
False

et qui évalue à True : retourne le dernier objet 'True'

>>> True and 1
1
>>> 1 and True
True

et qui évalue à False : retourne le premier objet 'False'

>>> '' and False
''
>>> False and ''
False

C'est un idiome Python important qui permet un code concis et compact pour traiter la logique booléenne sur des objets Python réguliers.

>>> bool([])
False
>>> bool([0])
True
>>> bool({})
False
>>> bool({False: False})
True
>>> bool(0)
False
>>> bool(-1)
True
>>> bool('False')
True
>>> bool('')
False

Essentiellement, les objets 'vides' sont False, les objets 'non vides' sont True.

Combinez ceci avec les réponses de @detly et des autres pour obtenir des informations sur la manière d'utiliser if et les booléens en Python.

7voto

Matthew Flaschen Points 131723

Oui. Il y a garantis d'être exactement deux bool, True and False :

La classe bool ne peut pas être sous-classée davantage. Ses seules instances sont False et True.

Cela signifie si vous savez que les deux opérandes sont bool, == et is sont équivalents. Cependant, comme le note detly, il n'y a généralement aucune raison d'utiliser l'un ou l'autre dans ce cas.

5voto

Il semble que toutes les réponses traitent de Vrai et Faux tels que définis après le démarrage d'un interpréteur. Avant que les booléens ne fassent partie de Python, ils étaient souvent définis comme partie d'un programme. Même maintenant (Python 2.6.6) ce ne sont que des noms qui peuvent pointer vers différents objets :

>>> True = 1
>>> (2 > 1)
True
>>> (2 > 1) == True
True
>>> (2 > 1) is True
False

Si vous devez travailler avec un logiciel plus ancien, soyez conscient de cela.

2voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X