Est Faux == 0 et True == 1 un détail d'implémentation, ou est-il garanti par la langue?
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, 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é!
Modifier: Comme indiqué dans de nombreuses réponses, bool
hérite de 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!
- Il y a de nombreuses raisons de se poser la question ci-dessus. Ainsi, il y a des cas où s'appuyant sur les booléens entier rend votre code plus simple: avez-vous le changer? Ou, vous pouvez repérer les lieux dans un code écrit par quelqu'un d'autre qui s'appuie sur les booléens sont des nombres entiers: avez-vous interrompre ce que vous êtes en train de modifier dans le code afin de "fixer" un code existant, ou vous pouvez être assuré que le courant de codage est le son? Il existe une multitude d'autres exemples. Plus généralement, il est bon de connaître les règles du jeu, de sorte que vous pouvez jouer et le programme dans un son chemin.
- pouvez-vous fournir un exemple de "s'appuyant sur les booléens entier rend votre code plus simple"? Je ne peux pas imaginer une telle chose. " avez-vous interrompre ce que vous êtes en train de modifier dans le code afin de "fixer" un code existant, ou vous pouvez être assuré que le courant de codage est le son?" La question semble technique, n'est pas "comment dois-je faire?" Les règles sont simples: ne dépendent pas de la mise en œuvre de détails. Alors pourquoi poser des questions sur un détail d'implémentation?
- Le post original précisément les échos de votre point: la question est essentiellement "Est-ce qu'un détail d'implémentation?", parce que je suis entièrement d'accord avec vous sur l'idée que l'on ne doit pas s'appuyer sur les détails d'implémentation. Si les booléens sont officiellement entiers de valeurs connues, puis le code en question ne repose pas sur les détails de mise en œuvre, ce qui est bon.
- Lot: Sachant que==False 0 et True==1 en fait, il est plus facile de compter combien de booléens dans une séquence sont remplies: il Vous suffit d'écrire
sum(bool_list)
. Sinon, vous auriez à écriresum(1 for x bool_list if x)
. - C'est une façon de comptage des valeurs booléennes. Je dirais que
bool_list.count(True)
est plus explicite; c'est aussi 3 fois plus vite... 🙂 - Le traitement des booléens comme des entiers est une erreur de type. Si Python a types. Je ne voudrais pas faire des erreurs dans le code.
- Comme les réponses montrent, Python booléens sont en fait (une sous-classe spécifique de des entiers. En outre, Python, bien évidemment, des types, peut-être que vous avez voulu dire qu'il n'est "pas statiquement typé"? Aussi, je ne suis pas sûr de ce que tu veux dire par "je ne voudrais pas faire des erreurs dans le code". Maintenant, je n'ai jamais aime le mélange des booléens avec des entiers, parce qu'ils sont conceptuellement différentes, et je ne me dérangerait pas si Python booléens n'étaient pas des entiers, mais en sachant qu'ils sont, avec les valeurs 0 et 1, est utile.
Vous devez vous connecter pour publier un commentaire.
En Python 2.x c'est pas garanti car il est possible pour
True
etFalse
ê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
etFalse
sont des mots-clés et sera toujours égal à1
et0
.Dans des circonstances normales en Python 2, et toujours en Python 3:
False
objet est de typebool
qui est une sous-classe deint
: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 marque-dickinson).Edit:
Il est vrai de l'actuelle version de python, et de celle de Python 3. Le docs pour python 2.6 et la docs pour Python 3 disent tous les deux:
et dans le booléen paragraphe:
Il y a aussi, pour Python 2:
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. 😉
__index__
méthode peut être utilisée comme un indice de la liste, et pas seulement des sous-classes deint
oulong
.a = True; True = 'i am an idiot'; a == True
=> False. Autre que cette affection, les valeurs par défaut sont normalisés de 0 et de 1, et je crois qu'il est de pratique courante à en dépendent; par exemple, pour les index dans un tableau à deux éléments, où [0] conserve la fausse affaire, [1] true.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 sauf 0.
En Python 2.x, il n'est pas garanti à tous:
De sorte qu'il pourrait changer. En Python 3.x, True, False, et Aucun n'est les 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 l'avez pas changé, comme ci-dessus), Véritable pourrait avoir toute autre valeur. Je ne serais pas nécessairement compter sur aucune garantie que
True==1
, mais sur Python 3.x, ce sera toujours le cas, peu importe quoi.Très simple. Comme bool a trait à l'évaluation d'un entier comme un bool, SEULEMENT le zéro donne une réponse fausse. TOUTES les valeurs Non nulles, des flotteurs, des entiers, y compris les nombres négatifs, ou qu'avez-vous, retournera true.
Un bel exemple de pourquoi c'est utile, c'est de déterminer l'état de l'alimentation d'un périphérique. Sur est une valeur non nulle, off est zéro. Électroniquement parlant cela fait sens.
Pour déterminer vrai ou faux relativement entre les valeurs, vous devez avoir quelque chose à comparer à. Ceci s'applique pour les chaînes et les nombres, à l'aide de
==
ou!=
ou<
,>
>=
,<=
, etc.Vous pouvez affecter un entier à une variable et ensuite obtenir true ou false selon que la valeur de la variable.
Il suffit d'écrire
int(False)
et vous obtiendrez0
, si vous tapezint(True)
il sera de sortie1
int()
, avec un simple sens numérique, non pas qu'ils sont exactement identiques à la 0 et 1.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 0Le python de la documentation de l'opérateur == est dit (l'aide('==')):
Comme une conséquence de Faux est converti en entier pour le besoin de la comparaison. Mais il est différent de 0.
bool
est une sous-classe deint
, donc dans un sens très réel bool est un entier. Par exemple,isinstance(True, int)
renvoie la valeur True. Et le contrôle d'égalité ne pas convertir le bool int, puisque aucune conversion n'est nécessaire: il appelle simplementint.__cmp__
directement. Notez quebool.__cmp__ is int.__cmp__
évalue aussi pourTrue
.isinstance(True, int)
=> True. C'est, Vrai EST un entier, et ne nécessite pas de conversion.while response is False
travaillé, etwhile response == False
n'ai pas.. Merci!0 is False
est faux vous dit rien. Dans votre interactive interprète, entrezx = -10
, puisy = -10
, puisx is y
et ce aussi faux. Juste parce qu'il y a des optimisations dans le lieu où l'interpréteur Python ré-utilise le même entier des objets dans certaines circonstances (stocker les littéraux entiers comme des constantes, un stage de petits entiers) ne signifie pas queis
doit être utilisé lorsque vous voulez tester entier valeur de l'égalité.