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 à écrire sum(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.