303 votes

Est Faux == 0 et True == 1 en Python un détail d'implémentation, ou est-il garanti par la langue?

Est-il garanti que les Faux == 0 et True == 1, en Python? Par exemple, il est en quelque sorte la garantie que le code suivant va toujours produire les mêmes résultats, quelle que soit la version de Python (à la fois existants et, probablement, d'autres dans l'avenir)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

Toute référence à la documentation officielle serait bien apprécié! D'autres commentaires seraient appréciés trop... :)

Edit: Comme indiqué dans de nombreuses réponses, bool hérite int. La question peut donc être qualifié de: "la documentation officiellement dire que les programmeurs peuvent compter sur les booléens héritant de nombres entiers, avec les valeurs 0 et 1?". Cette question est pertinente pour l'écriture de code robuste qui ne manquera pas à cause de détails de mise en œuvre!

240voto

Olivier Verdier Points 12332

En Python 2.x c'est pas garanti qu'il est possible pour True et False être réaffectés. Cependant, même si cela se produit, boolean boolean True et False sont toujours retournés correctement pour les comparaisons.

En Python 3.x True et False sont des mots-clés et sera toujours égal à 1 et 0.

Dans des circonstances normales en Python 2, et toujours en Python 3:

False objet est de type bool qui est une sous-classe de int:

object
   |
 int
   |
 bool

C'est la seule raison pour laquelle, dans votre exemple, ['zero', 'one'][False] fonctionne. Il ne serait pas travailler avec un objet qui n'est pas une sous-classe d'un entier, parce que la liste d'indexation ne fonctionne qu'avec des entiers, ou des objets qui définissent un __index__ méthode (merci mark-dickinson).

Edit:

Il est vrai de l'actuelle version de python, et de celle de Python 3. La documentation pour la version 2.6 de python et de la documentation pour Python 3 fois dire:

Il existe deux types d'entiers: [...] des Entiers (int) [...] les Booléens (bool)

et dans le booléen paragraphe:

Les booléens: ils représentent les valeurs de vérité de Faux et de Vrai [...] des valeurs Booléennes se comportent comme les valeurs 0 et 1, respectivement, dans presque tous les contextes, à l'exception que lorsqu'il est converti en chaîne de caractères les chaînes de caractères "False" ou "True" sont renvoyés, respectivement.

Donc, les booléens sont explicitement considérés comme des entiers en Python 2.6 et 3.

Ainsi, vous êtes sûr jusqu'à ce que Python 4 vient le long. ;-)

88voto

Erik Cederstrand Points 499

Lien vers le PEP de discuter de la nouvelle type bool en Python 2.3: http://www.python.org/dev/peps/pep-0285/.

Lors de la conversion d'une valeur bool int, la valeur de l'entier est toujours 0 ou 1, mais lors de la conversion d'un int bool, la valeur booléenne est Vraie pour tous les entiers à l'exception de 0.

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False

24voto

Daniel G Points 12647

En Python 2.x, il n'est pas garanti à tous:

>>> False = 5
>>> 0 == False
False

De sorte qu'il pourrait changer. En Python 3.x, True, False, et Aucun des mots réservés, de sorte que le code ci-dessus ne fonctionnerait pas.

En général, avec les booléens, vous devez considérer que tout Faux ont toujours une valeur entière de 0 (tant que vous ne changez pas, comme ci-dessus), Véritable pourrait avoir toute autre valeur. Je ne serais pas nécessairement compter sur aucune garantie qu' True==1, mais sur Python 3.x, ce sera toujours le cas, peu importe quoi.

-5voto

luc Points 13564

Le faux est un bool. Il a un type différent. C'est un objet différent de 0, ce qui est un entier.

0 == False renvoie la valeur True parce que de Faux est converti en un entier. int(False) retourne 0

Le python de la documentation de l'opérateur == est dit (l'aide('==')):

Les opérateurs <, >, ==, >=, <=, et != comparer les valeurs de deux objets. Les objets n'ont pas besoin d'avoir le même type. Si les deux sont des nombres, ils sont convertis en un type commun.

En conséquence Faux est converti en entier pour le besoin de la comparaison. Mais il est différent de 0.

>>> 0 is False
False

J'espère que cela aide

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