Est-ce garanti False == 0
et True == 1
en Python (en supposant qu'ils ne sont pas réaffectés par l'utilisateur)? Par exemple, est-il garanti de quelque manière que le code suivant produira toujours les mêmes résultats, quelle que soit la version de Python (à la fois existante et, probablement, future)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Toute référence à la documentation officielle serait très appréciée!
Edit : Comme indiqué dans de nombreuses réponses, bool
hérite de int
. La question peut donc être reformulée comme suit: "La documentation dit-elle officiellement que les programmeurs peuvent s'appuyer sur des booléens héritant d'entiers, avec les valeurs 0
et1
?". Cette question est pertinente pour écrire du code robuste qui n'échouera pas à cause des détails d'implémentation!
python
boolean
equality
language-specifications
Eric O Lebigot
la source
la source
sum(bool_list)
. Sinon, il faudrait écriresum(1 for x bool_list if x)
.bool_list.count(True)
c'est plus explicite; c'est aussi environ 3 fois plus rapide… :)Réponses:
Dans Python 2.x, cela n'est pas garanti car il est possible
True
etFalse
réassigné. Cependant, même si cela se produit, boolean True et boolean False sont toujours correctement renvoyés pour les comparaisons.En Python 3.x
True
etFalse
sont des mots clés et seront toujours égaux à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]
cela fonctionne. Cela ne fonctionnerait pas avec un objet qui n'est pas une sous-classe d'entiers, car l'indexation de liste ne fonctionne qu'avec des entiers ou des objets qui définissent une__index__
méthode (merci mark-dickinson ).Éditer:
C'est vrai de la version actuelle de python et de celle de Python 3. Les documents pour python 2.6 et les documents pour Python 3 disent tous les deux:
et dans la sous-section booléenne:
Il y a aussi, pour Python 2 :
Les booléens sont donc explicitement considérés comme des entiers dans Python 2.6 et 3.
Vous êtes donc en sécurité jusqu'à ce que Python 4 arrive. ;-)
la source
__index__
méthode peut être utilisé comme index de liste; pas seulement des sous-classes deint
oulong
.a = True; True = 'i am an idiot'; a == True
=> Faux. Hormis une telle réaffectation, les valeurs par défaut sont normalisées à 0 et 1, et je pense que c'est une pratique courante de dépendre de cela; par exemple pour indexer dans un tableau à deux éléments, où [0] contient le faux cas, [1] vrai.Lien vers le PEP discutant du nouveau type de booléen dans Python 2.3: http://www.python.org/dev/peps/pep-0285/ .
Lors de la conversion d'un booléen en int, la valeur entière est toujours 0 ou 1, mais lors de la conversion d'un int en booléen, la valeur booléenne est True pour tous les entiers sauf 0.
la source
Dans Python 2.x, ce n'est pas du tout garanti:
Cela pourrait donc changer. Dans Python 3.x, True, False et None sont des mots réservés , donc le code ci-dessus ne fonctionnerait pas.
En général, avec les booléens, vous devez supposer que si False aura toujours une valeur entière de 0 (tant que vous ne la modifiez pas, comme ci-dessus), True pourrait avoir n'importe quelle autre valeur. Je ne m'appuierais pas nécessairement sur une garantie
True==1
, mais sur Python 3.x, ce sera toujours le cas, quoi qu'il arrive.la source
Très simple. Comme bool concerne l'évaluation d'un entier comme un bool, SEULEMENT zéro donne une fausse réponse. TOUTES les valeurs non nulles, les flottants, les entiers, y compris les nombres négatifs, ou ce que vous avez, renverront vrai.
Un bon exemple de la raison pour laquelle cela est utile est de déterminer l'état d'alimentation d'un périphérique. On est une valeur non nulle, off est zéro. Sur le plan électronique, cela a du sens.
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 affecter un entier à une variable, puis obtenir la valeur true ou false en fonction de cette valeur de variable.
la source
Il suffit d'écrire
int(False)
et vous obtiendrez0
, si vous tapez,int(True)
il sortira1
la source
int()
, avec une signification numérique simple, pas qu'elles sont exactement identiques à 0 et 1.Faux est un bool. Il a un type différent. C'est un objet différent de 0 qui est un entier.
0 == False
renvoie True car False est converti en un entier. int (False) renvoie 0La documentation python de l'opérateur == dit (help ('==')):
En conséquence, False est converti en un entier pour les besoins de la comparaison. Mais c'est différent de 0.
la source
bool
est une sous-classe deint
, donc dans un sens très réel, un booléen est un entier. Par exemple,isinstance(True, int)
renvoie True. Et le contrôle d'égalité ne convertit pas le booléen en entier, car aucune conversion n'est nécessaire: il appelle simplementint.__cmp__
directement. Notezbool.__cmp__ is int.__cmp__
qu'évalue égalementTrue
.isinstance(True, int)
=> Vrai. C'est-à-dire que True EST un entier et ne nécessite pas de conversion.while response is False
travaillé, etwhile response == False
non .. Merci!0 is False
faux ne vous dit rien. Dans votre interprète interactif, entrezx = -10
, puisy = -10
, puisx is y
et ce sera également faux. Ce n'est pas parce qu'il y a des optimisations en place que l'interpréteur Python réutilise les mêmes objets entiers dans certaines circonstances (stockage de littéraux entiers sous forme de constantes, internement de petits entiers) que cela neis
devrait pas être utilisé lorsque vous souhaitez tester l' égalité des valeurs entières .