Est faux == 0 et vrai == 1 en Python un détail de mise en œuvre ou est-elle garantie par la langue?

StackOverflow https://stackoverflow.com/questions/2764017

Question

est-il garanti que False == 0 et True == 1, en Python (en supposant qu'ils ne sont pas réaffectés par l'utilisateur)? Par exemple, est-il en aucune façon garanti que le code suivant toujours les mêmes résultats, quelle que soit la version de Python (existants et, probablement, les futurs)?

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

Toute référence à la documentation officielle serait très apprécié!

Modifier : Comme indiqué dans de nombreuses réponses, bool hérite de int. La question peut donc être reformulée comme suit: « La documentation dit officiellement que les programmeurs peuvent compter sur 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 des détails d'implémentation!

Était-ce utile?

La solution

En Python 2.x ceci est pas garanti car il est possible d'être réaffectés True et False. Cependant, même si cela se produit, booléen Faux Vrai et booléens sont toujours correctement retourné pour les comparaisons.

En Python 3.x True et False sont des mots clés et seront 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

Il est la seule raison pour laquelle dans votre exemple, ['zero', 'one'][False] fonctionne. Il ne fonctionnerait pas avec un objet qui n'est pas une sous-classe d'entier, parce que l'indexation de la liste fonctionne uniquement avec des entiers ou des objets qui définissent un __index__ méthode (grâce ).

Edit:

Il est vrai de la version python actuelle et de celle de Python 3. docs pour python 2.6 et docs pour Python 3 à la fois par exemple:

  

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

et dans le paragraphe booléen:

  

booléens: Ceux-ci représentent les valeurs de vérité et Vrai Faux [...] Boolean valeurs se comportent comme les valeurs 0 et 1, respectivement, dans presque tous les contextes, l'exception étant que lorsqu'elle est convertie en une chaîne, les chaînes « Faux » ou "True" sont retournés respectivement.

Il y a aussi, pour Python 2 :

  

Dans un contexte numérique (par exemple lorsqu'il est utilisé comme argument à un opérateur arithmétique), ils [Faux et vrai] se comportent comme les entiers 0 et 1, respectivement.

booléens sont explicitement considérés comme des entiers dans Python 2.6 et 3.

Vous êtes en sécurité jusqu'à ce que Python 4 arrive. ; -)

Autres conseils

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

Lors de la conversion d'un bool à un int, la valeur de nombre entier est toujours égal à 0 ou 1, mais lors de la conversion d'un entier à un bool, la valeur booléenne est vraie pour tous les entiers sauf 0.

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

En Python 2.x, il n'est pas garanti du tout:

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

Il pourrait changer. Dans Python 3.x, True, False et None sont mots réservés , de sorte que le code ci-dessus ne marcherait pas.

En général, avec booléens, vous devriez supposer que tout faux aura toujours une valeur entière de 0 (tant que vous ne changez pas, comme ci-dessus), True pourrait avoir une autre valeur. Je me fierais pas nécessairement une garantie que True==1, mais sur Python 3.x, ce sera toujours le cas, peu importe quoi.

très simple. Comme bool se rapporte à l'évaluation d'un nombre entier comme bool, zéro seulement donne une réponse fausse. Toutes les valeurs non-zéro, flotteurs, entiers, y compris les numéros de négatifs, ou ce que vous avez, retourne vrai.

Un bel exemple de pourquoi il est utile consiste à déterminer l'état d'alimentation d'un dispositif. On est une valeur non nulle, hors est égal à zéro. parlant ce sens électronique.

Pour déterminer vrai ou faux relativement entre les valeurs, vous devez avoir quelque chose à comparer. Ceci est valable pour les chaînes et les valeurs numériques, en utilisant == ou != ou <, > >=, <=, etc.

Vous pouvez attribuer un entier à une variable et obtenir vrai ou faux basée sur cette valeur variable.

Il suffit d'écrire int(False) et vous obtiendrez 0, si vous tapez int(True) il affichera 1

Faux est un bool. Il a un type différent. Il est un objet différent de 0, qui est un entier.

0 == False retourne Vrai Faux parce est jeté à un nombre entier. int rendements (false) 0

La documentation python de l'opérateur == dit (aide ( '==')):

  

Les opérateurs <, >, ==, >=, <= et != comparer les valeurs des deux objets. Les objets ne doivent pas 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 un entier pour le besoin de la comparaison. Mais il est différent de 0.

>>> 0 is False
False
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top